首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中的复杂排序(Teradata)

在SQL中的复杂排序(Teradata)
EN

Stack Overflow用户
提问于 2021-05-21 19:13:55
回答 3查看 277关注 0票数 0

我手边有个特殊的问题。我需要按以下方式排列:

  1. 每个ID得到一个新的级别。
  2. 等级#1被分配给具有最低日期的ID。但是,该特定ID的后续日期可能更高,但它们将获得其他ID的递增级别w.r.t。(例如,subsequently)
  3. For系列将被视为排名第一,因为它有最低的日期,虽然它以日期09-11月结束,RT659从13-8月开始,它将被排序为特定的ID,如果日期是连续的,那么排名是相同的,否则它们加起来1。对于一个特定的ID,等级是给定日期的ASC.

)。

如何制定一个查询?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-21 20:25:48

你需要两个步骤:

代码语言:javascript
复制
select
   id_col
  ,dt_col
  ,dense_rank()
   over (order by min_dt, id_col, dt_col - rnk) as part_col  
from
 (
    select
       id_col
      ,dt_col
      ,min(dt_col)
       over (partition by id_col) as min_dt
      ,rank()
       over (partition by id_col
             order by dt_col) as rnk
    from tab
 ) as dt

dt_col - rnk计算出相同的结果,对于连续日期,->相同的等级

票数 0
EN

Stack Overflow用户

发布于 2021-05-21 19:43:52

尝试引导/滞后的datediff,然后执行分区排序。

代码语言:javascript
复制
select t.ID_COL,t.dt_col, 
rank() over(partition by t.ID_COL, t.date_diff order by t.dt_col desc) as rankk 
from ( SELECT ID_COL,dt_col, 
DATEDIFF(day, Lag(dt_col, 1) OVER(ORDER BY dt_col),dt_col) as date_diff FROM table1 ) t
票数 0
EN

Stack Overflow用户

发布于 2021-05-21 22:00:53

考虑这个问题的一种方法是“什么时候增加1级”。当具有相同id_col的行上的前一个值相差超过一天时,就会发生这种情况。或者行是标识最早的一天。

这就将这个问题转化为一个累积的总和:

代码语言:javascript
复制
select t.*,
       sum(case when prev_dt_col = dt_col - 1 then 0 else 1
           end) over 
            (order by min_dt_col, id_col, dt_col) as ranking
from (select t.*,
             lag(dt_col) over (partition by id_col order by dt_col) as prev_dt_col,
             min(dt_col) over (partition by id_col) as min_dt_col
      from t
     ) t;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67642753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档