为啥 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:我对 nullfirst_value(date)order by date 的值持怀疑态度。似乎 OP 想要忽略 nulls,而 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() 不能正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ScrollView 不能正常工作?

为啥这个查询不能正常工作?

为啥程序不能正常工作?

为啥 AsyncTask 不能正常工作?

为啥模板类不能正常工作双重?

为啥 flex 属性不能正常工作?