【问题标题】:Qualify and Rank : Filtering data on text and timestamp in TeradataQualify and Rank:过滤 Teradata 中文本和时间戳的数据
【发布时间】:2015-10-05 18:16:19
【问题描述】:

我在 Teradata 中有一个数据集-

ID 名称 TMS
123 AAA 12:00
123 BBB 12:01
123 CCC 12:04
123 BBB 12:06
123 DDD 12:08
123 EEE 12:55
222 AAA 12:33
222 血脑屏障 12:10

查询应首先在名称列中找到最后一个“BBB”以获得唯一ID,然后显示BBB时间戳30分钟间隔内的每一行。因此,我的显示应该看起来像 -

ID 名称 TMS
123 BBB 12:06
123 DDD 12:08
222 BBB 12:10
我猜 Qualify 和 Rank 可以解决问题,但不确定。有人吗?

【问题讨论】:

    标签: filter teradata rank


    【解决方案1】:

    你不需要RANK:

    SELECT * FROM tab
    QUALIFY TMS BETWEEN MAX(CASE WHEN NAME = 'BBB' THEN TMS end) OVER (PARTITION BY ID) 
                    AND MAX(CASE WHEN NAME = 'BBB' THEN TMS end) OVER (PARTITION BY ID) + INTERVAL '30' MINUTE
    

    【讨论】:

    • 不错!永远不会考虑这种组合。
    • 但是,我还有一个问题——如果我想找到只有 BBB 作为名称的 ID,那么限定语句会是什么样子?例如,如果 ID 111 在第 1 行列出名称为 AAA 的行,在第 2 行列出 BBB,在第 3 行列出 CCC,那么我不需要 ID 111。如果 ID 223 只有一行以 BBB 作为名称,我想显示 ID 223 . 现在这里可能有 ID 223 的重复项,BBB 在第 1 行,BBB 在第 2 行。我仍然想要一个单行(第一行)作为输出。如果列出的任何 ID 有多个名称,我不想要它。我该怎么做?
    • @ASuit:这将找到只有一个名称的行:QUALIFY MIN(NAME) OVER (PARTITION BY ID) = MAX(NAME) OVER (PARTITION BY ID) AND ROW_NUMBER() OVER (PARTITION BY ID ORDER BY TMS) = 1
    猜你喜欢
    • 2014-01-03
    • 2018-04-16
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    相关资源
    最近更新 更多