假设我有一个价格表,如下表所示。我想返回一个基于以下条件的,由不同ItemCode值组成的表,彼此相关...
+----------+-------+----------+------------+------------+
| ItemCode | Price | Currency | StartDate | EndDate |
+----------+-------+----------+------------+------------+
| A02143803 | 18 | USD | 01/09/2019 | NULL |
+----------+-------+----------+------------+------------+
| A02143803 | 17 | EUR | 01/09/2019 | NULL |
+----------+-------+----------+------------+------------+
| A02143805 | 18 | USD | 01/09/2019 | 31/12/2019 |
+----------+-------+----------+------------+------------+
| A02143805 | 17,7 | USD | 01/01/2020 | NULL |
+----------+-------+----------+------------+------------+
| A02143805 | 16 | EUR | 01/09/2019 | NULL |
+----------+-------+----------+------------+------------+
最终结果应类似于:
+----------+-------+----------+------------+---------+
| ItemCode | Price | Currency | StartDate | EndDate |
+----------+-------+----------+------------+---------+
| A02143803 | 18 | USD | 01/09/2019 | NULL |
+----------+-------+----------+------------+---------+
| A02143805 | 17,7 | USD | 01/01/2020 | NULL |
+----------+-------+----------+------------+---------+
[请您提出获得此结果的最佳方法是什么?SQL COALESCE是否可以解决我的问题?
您可以使用row_number()
:
select t.*
from (select t.*,
row_number() over (partition by itemcode
order by (case when Currency = 'USD' then 0 else 1 end)
(case when enddate is null then 1 else 0 end), enddate desc
) as seq
from table t
) t
where seq = 1;
尝试一下:
SELECT *,
ROW_NUMBER() OVER (PARTITION BY ItemCode
ORDER BY
CASE
WHEN Currency = 'USD' THEN 1
ELSE 2
END,
CASE
WHEN EndDate IS NULL THEN 1
ELSE 2
END)
FROM Table1