为啥 FIRST_VALUE() 不能正常工作?
Posted
技术标签:
【中文标题】为啥 FIRST_VALUE() 不能正常工作?【英文标题】:Why FIRST_VALUE() is not working properly?为什么 FIRST_VALUE() 不能正常工作? 【发布时间】:2020-07-23 13:08:12 【问题描述】:我正在使用 SQL 中的 FIRST_VALUE()
窗口函数运行查询。我没有得到正确的结果。
表格格式如下:
ID DATE
1 2020-01-01
1 2020-01-02
1 NULL
2 2020-03-03
2 2020-05-06
3 2020-06-07
3 2020-05-12
我想做的是获取每个 ID 的第一个最早日期。我正在使用的当前查询是这样的:
SELECT DISTINCT id,
FIRST_VALUE(date) over (PARTITION BY id ORDER BY date ASC) as oldest_date
FROM tableX
注意:日期可以为NULL。
P.S.我已经尝试过自加入,它可以工作。
谢谢
【问题讨论】:
你得到了什么结果? @P.Salmon 我有很多数据,所以它给了我随机日期而不是最旧的日期。 请向我们展示您想要的样本数据结果。 您的查询按编码工作,每个 id 生成 1 行,第一个日期。您需要通过从示例数据中发布所需的输出来阐明您想要什么, @P.Salmon 假设id = 1
我想要 2020-01-01,对于 id = 2
,我想要 2020-03-03。
【参考方案1】:
您正在混合 distinct
和窗口函数,这使得您不清楚您真正想要的结果。
如果您希望每个id
有一行,最旧的非null
date
,则使用聚合:
select id, min(date) oldest_date
from tableX
group by id
如果您想要表中的行数,以及共享相同 id
的行中最旧的日期,那么我会推荐一个窗口 min()
:
select t.*, min(date) over(partition by id) oldest_date
from tableX t
【讨论】:
@P.Salmon:我对null
与 first_value(date)
和 order by date
的值持怀疑态度。似乎 OP 想要忽略 null
s,而 min()
就是这样做的。
它仍然无法处理我的数据。只有自我加入解决方案有效,
@Uzair:不工作并不准确。您还没有显示您想要的结果。请通过编辑您的问题提供该信息,以便我们更好地理解,并可能调整答案。
如果我不使用带有窗口功能的DISTINCT
,它不会给我每个id 一行。这就是我使用DISTINCT
的原因。
@Uzair 。 . .所需的结果应该在 question! 中【参考方案2】:
如果您的问题是 NULL
日期,则添加另一个排序级别:
SELECT DISTINCT id,
FIRST_VALUE(date) over (PARTITION BY id ORDER BY date IS NULL, date ASC) as oldest_date
FROM tableX
如果 id 没有任何非空日期,这仍将返回 NULL
。
请参阅demo。
结果:
| id | oldest_date |
| --- | ----------- |
| 1 | 2020-01-01 |
| 2 | 2020-03-03 |
| 3 | 2020-05-12 |
【讨论】:
以上是关于为啥 FIRST_VALUE() 不能正常工作?的主要内容,如果未能解决你的问题,请参考以下文章