SQL在GROUP BY中加入最新结果

时间:2018-07-29 17:51:14

标签: sql apache-spark-sql window-functions

我有下表:

+--------------------+----------+--------+-----------------+
|JOB_RUN_DATE_TIME_ts|JOB_STATUS|JOB_NAME|UPSTREAM_JOB_NAME|
+--------------------+----------+--------+-----------------+
|                   1|         0|       Y|                Z|
|                   2|         0|       Y|                Z|
|                   3|         1|       Y|                Z|
|                   4|         0|       Y|                Z|
|                   5|         1|       Y|                Z|
|                   6|         0|       Y|                Z|
|                   1|         0|       Z|             null|
|                   2|         0|       Z|             null|
|                   1|         1|       X|                Y|
|                   2|         0|       X|                Y|
|                   3|         0|       X|                Y|
|                   4|         0|       X|                Y|
|                   5|         0|       X|                Y|
|                   6|         0|       X|                Y|
|                   7|         1|       X|                Y|
|                   8|         1|       X|                Y|
+--------------------+----------+--------+-----------------+

JOB_NAME是为其定义JOB_STATUS的作业。如果JOB_STATUS = 1,则作业失败。我使用这些数据的主要假设之一是上游作业的失败对下游作业意味着坏消息。我在创建表格时遇到麻烦,可以让我检验这个假设。

表中的每一行代表特定作业的特定运行。对于这些行中的每一行,我想知道其上游作业的上次运行的结果是什么。最终,我的表将如下所示:

+--------------------+----------+--------+-----------------+-----------------+
|JOB_RUN_DATE_TIME_ts|JOB_STATUS|JOB_NAME|UPSTREAM_JOB_NAME|PREV_US_JOB_STATUS
+--------------------+----------+--------+-----------------+-----------------+
|                   1|         0|       Y|                Z|                0|
|                   2|         0|       Y|                Z|                0|
|                   3|         1|       Y|                Z|                0|
|                   4|         0|       Y|                Z|                0|
|                   5|         1|       Y|                Z|                0|
|                   6|         0|       Y|                Z|                0|
|                   1|         0|       Z|             null|             null|
|                   2|         0|       Z|             null|             null|
|                   1|         1|       X|                Y|                0|
|                   2|         0|       X|                Y|                0|
|                   3|         0|       X|                Y|                1|
|                   4|         0|       X|                Y|                0|
|                   5|         0|       X|                Y|                1|
|                   6|         0|       X|                Y|                0|
|                   7|         1|       X|                Y|                0|
|                   8|         1|       X|                Y|                0|
+--------------------+----------+--------+-----------------+-----------------+

请注意,null是针对没有上游作业的行而填充的。如何使用SQL创建此视图?

我知道使用分区将有助于查找每个作业的最新记录,但是我无法弄清楚完整的配方:

SELECT
*,
ROW_NUMBER() OVER (PARTITION BY UPSTREAM_JOB_NAME ORDER BY JOB_RUN_DATE_TIME_ts DESC) AS seqnum
FROM
tb
LEFT JOIN tb tmp_tb
ON tmp_tb.UPSTREAM_JOB_NAME = tb.JOB_NAME

1 个答案:

答案 0 :(得分:0)

我认为left join是您想要的:

select tb.*, tbu.status
from tb left join
     tb tbu
     on tb.UPSTREAM_JOB_NAME = tbu.JOB_NAME and
        tb.JOB_RUN_DATE_TIME_ts = tbu.JOB_RUN_DATE_TIME_ts;