【问题标题】:Count number of rows where a row-level flag changed in a monthly snapshot table计算每月快照表中行级标志更改的行数
【发布时间】:2021-05-04 05:13:26
【问题描述】:

我正在处理每月帐户表,该表存储每月月底帐户状态的快照。它是按月划分的。

例子:

MNTH_END_DT  ACCT_ID  STATUS_CD
-----------  -------  ---------
1/31/2021    1234     I
2/28/2021    1234     I
3/31/2021    1234     A

我正在尝试计算任何给定月份的 STATUS_CD 更改为“A”的所有帐户,而上个月仍为“I”。我这样做了大约三年的数据。

我尝试进行自加入,但没有得到正确的结果。这是我的代码示例

SELECT
  a1.mnth_end_dt AS Mth
 ,a2.mnth_end_dt AS Prior_Mth
 ,SUM(CASE WHEN a1.status_cd = 'A' AND a2.status_cd = 'I' THEN 1 ELSE 0 END) AS Stat_Chg
 
 FROM acct_tbl AS a1

   INNER JOIN acct_tbl as A2
     ON a1.acct_id = a2.acct_id
     AND a1.mnth_end_dt = LAST_DAY(ADD_MONTHS(a2.mnth_end_dt,-1))
     AND a2.mnth_end_dt BETWEEN '2020-12-01' AND '2021-02-28'

 WHERE a1.mnth_end_dt BETWEEN '2021-01-01' AND '2021-03-31'

GROUP BY 1,2

这种方法似乎并没有真正起作用,因为这些是我得到的结果:

Mth        Prior_Mth  Stat_Chg
---------  ---------  ---------
1/31/2021  2/28/2021  500

忽略 Stat_Chg 值,这些只是说明性的。但在其他两列中,我希望看到 Prior_Mth 列比 Mth 列早一个月。例如。在上面的示例中,我希望看到 Prior_Mth 是 2020 年 12 月 31 日,而不是 2021 年 2 月 28 日。而且它也只返回一行结果,而我原本希望返回 3 行。

有什么更好的方法来做这件事的建议吗?

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    您不需要进行自我加入。假设每个月有一行:

    SELECT a.*
    FROM (SELECT a.*,
                 LAG(status_cd) OVER (PARTITION BY acct_id ORDER BY mtn_end_dt) as prev_status_cd
          FROM acct_tbl a
         ) a
    WHERE status_cd = 'A' AND prev_status_cd = 'I';
    

    【讨论】:

      【解决方案2】:

      正如 Gordon 已经写的,不需要自连接,只需对窗口函数进行聚合:

      select mth, Prior_Mth, count(*)
      from
       (
          SELECT mnth_end_dt as mth
            ,LAG(mnth_end_dt) OVER (PARTITION BY acct_id ORDER BY mtn_end_dt) as Prior_Mth
          FROM acct_tbl
          QUALIFY -- current status is A
                  status_cd = 'A' 
                  -- previous status was I
              AND LAG(status_cd) OVER (PARTITION BY acct_id ORDER BY mtn_end_dt) = 'I'
                  -- one month ago 
              AND Prior_Mth = oADD_MONTHS(mnth_end_dt,-1)
       ) as dt
      group by 1,2
      

      【讨论】:

        【解决方案3】:

        好吧,我是个白痴。我刚刚看到我的错误。

        在join中,我的一个join条件是

        a1.mnth_end_dt = LAST_DAY(ADD_MONTHS(a2.mnth_end_dt,-1))
        

        我改成

        a2.mnth_end_dt = LAST_DAY(ADD_MONTHS(a1.mnth_end_dt,-1))
        

        现在它可以工作了。把它留在这里,以防它对任何人有用。但是,如果不需要,请随时删除。

        【讨论】:

          猜你喜欢
          • 2016-06-17
          • 1970-01-01
          • 2022-12-07
          • 2016-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-09
          • 2019-01-24
          相关资源
          最近更新 更多