【问题标题】:Teradata SQL Query to filter only those rows who has entry for all period idsTeradata SQL 查询仅过滤具有所有期间 ID 条目的行
【发布时间】:2020-07-13 20:28:59
【问题描述】:

我有一个包含 3 列(ID、YYYYMM、销售额)的数据集。我只想让每个 YYYYMM(201909 到 202003)都有记录的那些 ID。

我想拥有 ID 和 YYYYMM 级别的日期。我不想使用 group by 并将数据集减少到一个 ID 行。

【问题讨论】:

  • YYYYMM的数据类型是什么?

标签: sql date count teradata window-functions


【解决方案1】:

嗯。 . .我认为这可以满足您的要求:

select t.*
from mytable t
where yyyymm >= 201909 and
      yyyymm <= 202003
qualify count(*) over (partition by id) = 6;

【讨论】:

    【解决方案2】:

    您可以使用窗口函数和qualify 子句:

    select t.*
    from mytable t
    qualify count(*) over(partition by id) 
        = 1 + max(floor(yyyymm / 100) * 12 + (yyymmm mod 100)) over() 
            - min(floor(yyyymm / 100) * 12 + (yyymmm mod 100)) over()
    

    qualify 子句计算当前id 存在的记录数,并将其与yyyymmdds 的总计数进行比较,可以通过减去其最大值和最小值来计算(假设这是一个数值,看起来)。

    【讨论】:

    • 由于没有月份 13-99 和 0,因此您的最大最小计算结果为 94 :-)
    • @dnoeth:是的,当然……感谢您指出这一点!好的,我确实(尝试)修复了算术。
    • 不能count(distinct yyyymm) over()得到总月数吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2020-04-05
    • 2021-10-27
    • 2016-08-20
    • 2020-05-16
    相关资源
    最近更新 更多