我在 postgres 中有下表(產品和變體是另一個表的外鍵 ID,但我使用產品/變體名稱使其更具可讀性):
| ID | 產品編號 | 變體ID | 有效自 | 貨幣代碼 | 價錢 |
|---|---|---|---|---|---|
| 1 | 蘋果手機 | X | 2021-01-01 | 歐元 | 19 |
| 2 | 蘋果手機 | X | 2021-02-01 | 歐元 | 29 |
| 3 | 蘋果手機 | X | 2021-03-01 | 歐元 | 39 |
| 4 | 蘋果手機 | 12 | 2021-01-01 | 歐元 | 49 |
| 5 | macbook | 空氣 | 2021-01-01 | 歐元 | 59 |
| 6 | macbook | 空氣 | 2021-02-01 | 歐元 | 69 |
| 7 | macbook | 親 | 2021-02-01 | 歐元 | 79 |
| 8 | macbook | 親 | 2021-01-01 | 美元 | 89 |
現在,當我需要在2021-01-20日期有效的價目表時,結果應該是:
| 產品 | 變體 | 有效自 | 貨幣代碼 | 價錢 |
|---|---|---|---|---|
| 蘋果手機 | X | 2021-01-01 | 歐元 | 19 |
| 蘋果手機 | 12 | 2021-01-01 | 歐元 | 49 |
| macbook | 空氣 | 2021-01-01 | 歐元 | 59 |
| macbook | 親 | 2021-01-01 | 美元 | 89 |
但是當我需要價目表有效日期2021年2月8日的結果應該是:
| 產品 | 變體 | 有效自 | 貨幣代碼 | 價錢 |
|---|---|---|---|---|
| 蘋果手機 | X | 2021-02-01 | 歐元 | 29 |
| 蘋果手機 | 12 | 2021-01-01 | 歐元 | 49 |
| macbook | 空氣 | 2021-02-01 | 歐元 | 69 |
| macbook | 親 | 2021-02-01 | 歐元 | 79 |
| macbook | 親 | 2021-01-01 | 美元 | 89 |
任何建議如何撰寫查詢?
非常感謝
uj5u.com熱心網友回復:
WITH cte AS
(SELECT productid AS Product,
variantid AS variant,
validfrom,
currencycode,
price,
Row_number() OVER(PARTITION BY productid, variantid
ORDER BY To_date(validfrom, 'YYYY-MM-DD') DESC) AS RNUM
FROM tbl
WHERE To_date(validfrom, 'YYYY-MM-DD') <= '2021-02-08')
SELECT product,
variant,
validfrom,
currencycode,
price
FROM cte
WHERE rnum = 1;
這tbl是表名
uj5u.com熱心網友回復:
這是一種方法:
select * from table t1
where id in (
select id from table t2
where t1.productId = t2.productId
and t1.careintid = t2.varientid
and t2.validfrom<= '<date param>'
order by validfrom desc limit 1
)
或使用視窗函式:
select * from(
select *, row_number() over (partition by productid, varientid order by case when validfrom <= '<dateparam>' then 1 else 0 end desc, validfrom desc) rn
) t where rn = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316313.html
標籤:sql PostgreSQL
