基于组 SQL Netezza 过滤数据
Posted
技术标签:
【中文标题】基于组 SQL Netezza 过滤数据【英文标题】:Filter data based on group SQL Netezza 【发布时间】:2021-05-23 20:06:05 【问题描述】:请给我下表,我需要根据 DATE 列过滤数据, 在 Sus_ID 级别中,如果 DATE 列有 NULL 获取此行,或者如果没有 NULL 记录将获取最新 DATE 的行
|Sub_ID |Cust_ID |C_Date |
|-------+-----------+----------|
|123456 |2233 |2021-02-21|
|123456 |2211 |2021-01-21|
|123456 |3432 |NULL |
|987654 |1122 |2021-02-21|
|987654 |3322 |2021-01-21|
想要的结果应该是下面
|Sub_ID |Cust_ID |C_Date |
|-------+-----------+----------|
|123456 |3432 |NULL |
|987654 |1122 |2021-02-21|
我尝试了下面的代码,但没有成功
Subs_ID,
CASE
WHEN C_Date IS NULL THEN Cust_ID
ELSE (FIRST_VALUE(Cust_ID) OVER (PARTITION BY Subs_ID ORDER BY C_Date DESC )) END AS Cust_ID_N
FROM
tbl
【问题讨论】:
【参考方案1】:您可以在ORDER BY
子句中使用ROW_NUMBER()
窗口函数和CASE
表达式:
SELECT Subs_ID, Cust_ID, C_Date
FROM (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY Subs_ID
ORDER BY CASE WHEN C_Date IS NULL THEN 1 ELSE 2 END, C_Date DESC
) rn
FROM tablename
) t
WHERE rn = 1
ORDER BY
子句也可以简化为:
ORDER BY C_Date IS NULL DESC, C_Date DESC
请参阅demo(适用于 mysql,但它是标准 SQL)。 结果:
Subs_ID | Cust_ID | C_Date |
---|---|---|
123456 | 3432 | null |
987654 | 1122 | 2021-02-21 |
【讨论】:
非常感谢@forpas 的大力支持【参考方案2】:Netezza 支持 SQL 标准 NULLS FIRST
语法。我建议您使用它:
select t.*
from (select t.*,
row_number() over (partition by sub_id order by c_date desc nulls first) as seqnum
from t
) t
where seqnum = 1;
【讨论】:
以上是关于基于组 SQL Netezza 过滤数据的主要内容,如果未能解决你的问题,请参考以下文章
将一个表的数据加载到驻留在不同数据库中的另一个表中 - Netezza