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

MySQL 时间戳记录正在更新,但受影响的行仍然为 0

使用 Spark Scala 为数据中的每个组选择窗口操作后的最新时间戳记录

SQL 外连接时间替换空值

impala 小记

在 hive/impala sql 中按日期获取数据,