【问题标题】:Issue with Ranking / Row Number / Ordering排名/行号/排序问题
【发布时间】:2019-09-10 05:30:23
【问题描述】:

我正在尝试将某种类型的排名系统应用于我的数据集并且遇到了问题。

我的问题:

RANK() OVER(PARTITION BY Staff, Storage ORDER BY Order_Flow)

基本上,每当出现 Storage 20 时,我都想为该行分配一个数字,并且它与下一个 Storage 20 出现之间的任何内容都具有相同的数字。然后从下一次出现 Storage 20 到下一次,同样的事情。

我当前的 Rank 函数无法准确捕获 Storage 80,因为它只是在订单流的后期才开始出现。

请查看图片(可以从1开始,不一定要从0开始)。

image of example data

【问题讨论】:

    标签: row teradata rank partition


    【解决方案1】:

    看起来这可以在窗口函数中使用RESET WHEN 解决:

    MAX() OVER(
      PARTITION BY <...> 
      ORDER BY Order_Flow 
      RESET WHEN Storage = 20
    )
    

    如果您只想控制排序而不需要进行任何分区,我相信您可以省略PARTITION BY。或者只使用一个常量值,例如 PARTITION BY 1 或类似的东西。

    文档:
    https://docs.teradata.com/reader/756LNiPSFdY~4JcCCcR5Cw/8uRgqNTevlcmjBfsU3WQsw

    Stackoverflow
    teradata, reset when, partition by, order by

    【讨论】:

    • 但是,这给了一个增量然后重置。我需要 Storage 20s 之间的所有东西都是相同的数字
    • 啊...好吧,那么您可能可以使用MAX()MIN() 而不是ROW_NUMBER()。抱歉,我无法访问 TD 系统,也无法查看您附加的图片。可以试试吗?
    • 20s 之间的行可以分配任意数字吗?还是这些数字必须是连续的?即第一对 20 之间的 10 行被赋值为 1;下一对 20 之间的 15 行的值为 2?
    • 谢谢馄饨。 Min() 看起来虽然分配了奇数,但它确实起到了作用。顺序会很棒,因为我想在后面的表格中管理会变得更加棘手。
    • 我已经将此 Min() 方法与第二个 Dense_Rank 结合使用来获取序列号。可能不漂亮,所以绝对欢迎优化建议。
    【解决方案2】:

    这是一个简单的 CASE 累积和:

    sum(case when Storage = 20 then 1 else 0 end)
    over(Partition By Staff
         Order By Order_Flow
         rows unbounded preceding)
    

    【讨论】:

    • 感谢 Dnoeth,这个方法最终给所有记录一个“2”。我使用了前面提到的 Min(),然后做了第二个 Dense_Rank 来获得我想要的序列号。如果有更有效的方法,我很乐意听到。
    • 对不起,我忘了ROWS UNBOUNDED PRECEDING
    猜你喜欢
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多