source

제품당 최신 두 줄을 구입하고 가격과 날짜를 확인합니다.

manysource 2023. 8. 8. 21:42

제품당 최신 두 줄을 구입하고 가격과 날짜를 확인합니다.

저는 제품당 최신 라인 두 개를 추출하는 쿼리를 만들었습니다.각 행에는 ID, 제품 번호, 가격 변경 날짜, 가격이 표시됩니다.

이드 제품번호 날짜. 가격. 순위 순서
71582 0071807993 2021-10-15 18:06:22 220.79 1
60533 0071807993 2021-10-15 13:22:46 220.79 2

다음 행을 연결하여 표시할 수 있습니까?

제품번호 최신 날짜 최신 가격 두 번째 최신 날짜 두 번째 최신 가격
0071807993 2021-10-15 18:06:22 220.79 2021-10-15 13:22:46 220.79

내 질문은 다음과 같습니다.

select * from
(
SELECT
    id,
    prodnumb,
    collectdate, price,row_number() over(partition by prodnumb order by id desc) as rn
FROM product
)A where rn <3

저는 이렇게 만들 수 있다는 것을 알게 되었습니다.

select prodnumb, max(collectdate), min(collectdate) 
from
(
SELECT
    id,
    prodnumb,
    collectdate, price,row_number() over(partition by prodnumborder by id desc) as rn
FROM product
-- WHERE deviceId > 0
)A where rn <3
group by prodnumb

그러면 다음을 알 수 있습니다: 제품 번호, 최신 날짜, 두 번째 최신 날짜.

하지만 가격은 어떻게 해야 합니까?

나의 해결책은 추천되지 않습니다.더 나은 솔루션을 보려면 아래의 Forpas 솔루션을 참조하십시오.

select p.prodnumb, f.collectdate, f.price, s.collectdate, s.price
from product p

left join (

    select * from
    (
    SELECT
        id,
        prodnumb,
        collectdate, price,row_number() over(partition by prodnumb order by id desc) as rn
    FROM product
    -- WHERE deviceId > 0
    )A where rn = 1
    
    )f on f.prodnumb = p.prodnumb



left join (

    select * from
    (
    SELECT
        id,
        prodnumb,
        collectdate, price,row_number() over(partition by prodnumb order by id desc) as rn
    FROM product
    -- WHERE deviceId > 0
    )A where rn = 2

    )s on s.prodnumb = p.prodnumb
    
group by p.prodnumb

로 할 수 있습니다.MAX(),MIN()그리고.FIRST_VALUE()창 기능:

SELECT DISTINCT prodnumb,
       MAX(collectdate) OVER (PARTITION BY prodnumb) NewestDate,
       FIRST_VALUE(price) OVER (PARTITION BY prodnumb ORDER BY collectdate DESC) NewestPrice,
       MIN(collectdate) OVER (PARTITION BY prodnumb) SecondNewestDate,
       FIRST_VALUE(price) OVER (PARTITION BY prodnumb ORDER BY collectdate) SecondNewestPrice
FROM (
  SELECT prodnumb, collectdate, price,
         ROW_NUMBER() OVER (PARTITION BY prodnumb ORDER BY id DESC) rn
  FROM product
) t 
WHERE rn < 3;

또는 조건부 집계를 사용한 경우:

SELECT prodnumb,
       MAX(CASE WHEN rn = 1 THEN collectdate END) NewestDate,
       MAX(CASE WHEN rn = 1 THEN price END) NewestPrice,
       MAX(CASE WHEN rn = 2 THEN collectdate END) SecondNewestDate,
       MAX(CASE WHEN rn = 2 THEN price END) SecondNewestPrice
FROM (
  SELECT prodnumb, collectdate, price,
         ROW_NUMBER() OVER (PARTITION BY prodnumb ORDER BY id DESC) rn
  FROM product
) t 
WHERE rn < 3
GROUP BY prodnumb;

사용 중입니다.ORDER BY id DESCROW_NUMBER()당신의 질문과 나는 그것을 내 코드에 보관했지만, 아마도 당신은 그것으로 바꿔야 할 것입니다.ORDER BY collectdate DESC.

언급URL : https://stackoverflow.com/questions/69602293/get-the-newest-two-line-per-product-and-get-price-and-date