我有一个表,需要根据日期进行过滤。
| Group | Account || Values | Date_ingested |
| -------- | -------- || -------- | -------- |
| X | 3000 || 0 | 2023-01-07 |
| Y | 3000 || null | 2021-02-22 |
目标是在有多个数据点时选择最晚的日期,就像上面的例子一样。数据框中的帐户3000出现在两个组下,但最新和正确的结果应该只反映组X,因为它是最近被摄取到Databricks中的。现在,如果我尝试使用下面的代码进行分组,代码将被执行,但max函数将被忽略,在结果中,我将得到帐户3000的两个结果,组X和组y
Select Group, Account, Values, max(Date_ingested) from datatableX
如果我选择使用不分组的代码,我会得到以下错误
SQL语句错误:AnalysisException: grouping expressions sequence is empty, and 'datatableX. s '。Account'不是一个聚合函数。在窗口函数中包装'(max(spark_catalog.datatableX.Date_ingested) '为' max(Date_ingested) '或包装'spark_catalog.datatableX. Date_ingested . 'Account' in first()(或first_value)如果你不关心你得到的是哪个值
我不能,然而,想出一个方法来做上面的。我试着阅读聚合函数,但是我不能理解这个概念。
Select Group, Account, Values, max(Date_ingested) from datatableX
或
Select Group, Account, Values, max(Date_ingested) from datatableX
group by Group, Account, Values
您想要每个帐户的完整最新记录,这建议过滤而不是聚合。
一种典型的方法是使用rank()
按摄取日期降序枚举具有相同帐户的记录,然后在外部查询中对每个组的顶部记录进行过滤:
select *
from (
select d.*,
row_number() over(partition by account order by date_ingested desc) rn
from datatableX
) d
where rn = 1