Impala SQL - 获取最大时间戳记录 - 不产生结果
Posted
技术标签:
【中文标题】Impala SQL - 获取最大时间戳记录 - 不产生结果【英文标题】:Impala SQL - Get Maximum Time Stamp Records - Not Yielding Results 【发布时间】:2018-07-16 18:58:15 【问题描述】:我有下表,我需要在每个源和表中获取具有最新时间戳的记录。 时间戳为 Unix 格式,1531204200 为最新时间戳。
上表数据如下:
src_sys_id st_mgmnt_cd tblnm execn_ts rcd_cnt
SOURCE1 HOT SUBSCRBR_ACCT_HIST 1531204200 28680
SOURCE1 COLD SUBSCRBR_ACCT_HIST 1531204200 11874
SOURCE1 WARM MEMBR_HIST 1531204200 13698
SOURCE1 WARM SUBSCRBR_ACCT_HIST 1531204200 24211
SOURCE1 HOT MEMBR_HIST 1531204200 18500
SOURCE2 FINAL CLAIM 1531204200 5000
SOURCE2 EXPIRED CLAIM 1531204200 8000
SOURCE2 WARM CLAIM 1531204200 20000
SOURCE2 HOT CLAIM 1531204200 45000
SOURCE2 COLD CLAIM 1531204200 10000
SOURCE3 WARM INDIV_CVRG 1531204200 2763
SOURCE3 HOT INDIV_CVRG 1531204200 11874
SOURCE1 HOT MEMBR_HIST 1528650875 32198
SOURCE2 WARM CLAIM 1528650875 28000
SOURCE2 HOT CLAIM 1528650875 60000
SOURCE3 HOT INDIV_CVRG 1528650875 14637
预期输出如下:
src_sys_id st_mgmnt_cd tblnm execn_ts rcd_cnt
SOURCE1 HOT SUBSCRBR_ACCT_HIST 1531204200 28680
SOURCE1 COLD SUBSCRBR_ACCT_HIST 1531204200 11874
SOURCE1 WARM MEMBR_HIST 1531204200 13698
SOURCE1 WARM SUBSCRBR_ACCT_HIST 1531204200 24211
SOURCE1 HOT MEMBR_HIST 1531204200 18500
SOURCE2 FINAL CLAIM 1531204200 5000
SOURCE2 EXPIRED CLAIM 1531204200 8000
SOURCE2 WARM CLAIM 1531204200 20000
SOURCE2 HOT CLAIM 1531204200 45000
SOURCE2 COLD CLAIM 1531204200 10000
SOURCE3 WARM INDIV_CVRG 1531204200 2763
SOURCE3 HOT INDIV_CVRG 1531204200 11874
我用下面的查询
Select distinct s1.src_sys_id ,
s1.st_mgmnt_cd,
from_unixtime(CAST(s2.execn_ts AS BIGINT)) as assessment_dt,
s1.rcd_cnt
from dlrm_data_retention.ret_st_mgmnt_sum s1
INNER JOIN
( select src_sys_id,st_mgmnt_cd,rcd_cnt,execn_ts,row_number() over (partition by src_sys_id order by execn_ts desc) as seqnum
from dlrm_data_retention.ret_st_mgmnt_sum
) s2
on s1.src_sys_id = s2.src_sys_id and s2.seqnum = 1
这不会产生结果。任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:您可以使用 ROW_NUMBER 加上 OVER (PARTITION BY + ORDER BY) 的组合:
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY table.src_sys_id,
table.st_mgmnt_cd
ORDER BY table.execn_ts DESC) AS row_number
FROM table) as time_sorted
WHERE row_number = 1
) as recent
WHERE row_number=1;
您首先选择所需的分区(也称为组)并对其进行排序 - 在您的情况下按时间戳。每个组的 Row_Number 从 1..n 开始。
想要的结果都有 row_number=1。
有关 Impala-OVER 语法的更多信息,请参阅 https://www.cloudera.com/documentation/enterprise/5-6-x/topics/impala_analytic_functions.html#over。
【讨论】:
以上是关于Impala SQL - 获取最大时间戳记录 - 不产生结果的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Swift 中的 print() 不会在目标 C 中将时间戳记录为 NSLog