1

가격, 항목 및 날짜가 가득한 테이블이 있습니다. 이것의 예는 다음과 같습니다가 가격 당 두 개의 행이 있으며, 그들은이 날짜별로 정렬 데이터 내에서두 행의 차이 또는 비율을 순서대로 가져 오는 집계 함수

AA, 1/2/3024, 1.22 
AA, 1/3/3024, 1.23 
BB, 1/2/3024, 4.22 
BB, 1/3/3024, 4.23 

. 이 데이터 세트를 마지막 가격에서 이전 가격으로의 차이를 보여주는 단일 제품 행으로 어떻게 압축합니까? [이것은 또한 비율에 적용되므로 AA는 1.23/1.22를 산출 할 것입니다.]

결과는 합 기능에도 불구하고

AA, todays price-yesterdays price 

같이해야 목록에 대해 아무런 뺄셈 기능이 없습니다.

저는 postgres 9.1을 사용하고 있습니다.

답변

2
select product, 
     sales_date, 
     current_price - prev_price as diff 
from (
    select product, 
     sales_date, 
     price as current_price, 
     lag(price) over (partition by product order by sales_date) as prev_price, 
     row_number() over (partition by product order by sales_date desc) as rn 
    from the_unknown_table 
) t 
where rn = 1; 

SQLFiddle 예 : http://sqlfiddle.com/#!15/9f7d6/1

+0

정말 멋지다! 오늘 저는 SQL Fiddle에 대해 배웠습니다. – monksy

+0

행 번호가 필요한지 이해하는 데 시간이 좀 걸렸지 만 지금은 이해하고 있습니다 – monksy

+0

세 번째 댓글 .. 그러나 오히려 순서에 따라 순서를 사용하고 순서에 대해 영리합니다. 처음에는 실수라고 생각했습니다. – monksy

0

다음 항목 당 두 개의 행을 있다면

SELECT item, MAX(price) - MIN(price) AS diff, MAX(price)/MIN(price) AS ratio 
FROM yourtable 
GROUP BY item 

이 트릭을 할 것입니다.

+0

차이가 날짜를 기반으로해야하므로 작동하지 않습니다. 일명 오늘의 가격 - 어제의 가격. – monksy

2

there are only two rows per price 때문에이 될 수 간단 훨씬 빠르게 :

SELECT n.item, n.price - o.price AS diff, n.price/o.price AS ratio 
FROM price n     -- "new" 
JOIN price o USING (item) -- "old" 
WHERE n.day > o.day; 

->SQLfiddle

이 양식은 추가적인 이점은 당신이 할 수있는 것을 전달 두 행의 모든 ​​열을 직접 사용하십시오. 지적 된 바와 같이 더 복잡한 시나리오 (이 필요하지)에 대한


, 당신은 윈도우 기능을 사용할 수 있습니다. 여기에 제안 된 것보다 더 간단한 방법은 다음과 같습니다

SELECT DISTINCT ON (item) 
     item 
     ,price - lead(price) OVER (PARTITION BY item ORDER BY day DESC) AS diff 
FROM price 
ORDER BY item, day DESC; 

하나의 윈도우 함수는 여기에 필요합니다. 하나의 쿼리 수준은 DISTINCT ON부터 창 함수 후에 에 적용됩니다. 창의 정렬 순서는 전체 정렬 순서와 일치하므로 성능이 향상됩니다.