제품당 최신 두 줄을 구입하고 가격과 날짜를 확인합니다.
저는 제품당 최신 라인 두 개를 추출하는 쿼리를 만들었습니다.각 행에는 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 DESC
에ROW_NUMBER()
당신의 질문과 나는 그것을 내 코드에 보관했지만, 아마도 당신은 그것으로 바꿔야 할 것입니다.ORDER BY collectdate DESC
.
언급URL : https://stackoverflow.com/questions/69602293/get-the-newest-two-line-per-product-and-get-price-and-date
'source' 카테고리의 다른 글
입력 유형 날짜로 날짜 설정 (0) | 2023.08.08 |
---|---|
table.datable.js의 함수가 아닙니다. (0) | 2023.08.08 |
다른 인터페이스로 구성된 인터페이스를 만드는 방법은 무엇입니까? (0) | 2023.08.08 |
헤드리스 브라우저로 테스트를 실행하려면 어떻게 해야 합니까? (0) | 2023.08.08 |
PHP의 base64 문자열에서 이미지 유형 탐지 (0) | 2023.08.08 |