【问题标题】:How to create dummy rows in SQL如何在 SQL 中创建虚拟行
【发布时间】:2021-07-10 09:12:23
【问题描述】:

我有下表:

loan_id first_term term month_due_time MOB dpd loan_principal dpd30p
1 202006 202006 5/7/2020 3 99 600000 600000
1 202006 202007 5/8/2020 4 95 600000 600000

如果我想创建一些 MOB 跨度从 1 到 6 的虚拟行,我该怎么办?期望的输出是:

loan_id first_term term month_due_time MOB dpd loan_principal dpd30p
1 202006 202006 5/7/2020 1
1 202006 202006 5/7/2020 2
1 202006 202006 5/7/2020 3 99 600000 600000
1 202006 202007 5/8/2020 4 95 600000 600000
1 202006 202006 5/7/2020 5
1 202006 202006 5/7/2020 6

【问题讨论】:

标签: sql presto trino


【解决方案1】:

好吧,您可以使用values()cross join 生成行,left join 引入现有值,coalesce() 将值替换为默认值:

select lf.loan_id, lf.first_term,
       coalesce(t.term, 200006),
       coalesce(t.month_due_time, '2020-05-07'),
       v.mob,
       t.dpd, t.loan_principal, tdpd30p
from (select distinct loan_id, first_term
      from t
     ) lf cross join
     (values (1), (2), (3), (4), (5), (6)) v(mob) left join
     t
     on t.loan_id = lf.loan_id and t.first_term = lf.first_term and
        t.mob = v.mob

【讨论】:

    【解决方案2】:

    此解决方案与@Gordon Linoff 提供的解决方案非常相似,但使用了 Trino 提供的序列函数。

    我们使用sequence(start, stop)生成范围,然后转换为列并执行RIGHT JOIN,然后使用coalesce填充默认值

    WITH rev_table(loan_id, first_term, term, month_due_time, MOB, dpd, loan_principal, dpd30p)
             AS (
            SELECT *
            FROM (VALUES (1, 202006, 202006, date ('2020-07-05'), 3, 99, 600000, 600000),
                         (1, 202006, 202007, date ('2020-08-05'), 4, 95, 600000, 600000))),
         mob_table(MOB) AS (
             SELECT *
             from UNNEST(SEQUENCE(1, 6))
         )
    
    SELECT coalesce(loan_id, 1) as loan_id,
           coalesce(first_term, 202006) as first_term,
           coalesce (term, 202006) as term,
           coalesce (month_due_time, date('2020-07-05')) as month_due_time,
           mt.MOB as MOB,
           dpd, loan_principal, dpd30p
    FROM rev_table rt RIGHT JOIN mob_table mt on mt.MOB = rt.MOB;
    

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 2023-01-27
      • 2017-10-23
      • 2020-07-13
      • 2011-04-09
      • 2019-09-23
      • 2016-05-17
      • 2011-05-29
      • 1970-01-01
      相关资源
      最近更新 更多