2016-02-25 58 views
-1

您好我正在尝试在Teradata V14 sql中做。 我的源表是这样的:基于另一列排序生成新列 - SQL

acc col1 col2 

100 12  13 
100 13  14 
100 17  23 
100 22  109 
100 23  110 
100 29  130 

我的目标表应该是:

New_Col1 New_Col2 Acc col1 col2 

1   1  100 12  13 
2   1  100 13  14 
3   2  100 17  23 
4   3  100 22  109 
5   3  100 23  110 
6   4  100 29  130 

New_Col1 - 行号 New_Col2 - 如果COL1和COL2在序列相同的值应为New_COl2。否则应该生成其他新的序列号 任何可以帮助我实现这一点。

+1

而这些新列的背后是你的逻辑....? – Siyual

+0

添加了Siyual。谢谢 – Madan

回答

2

您需要嵌套OLAP的功能:

SELECT dt.*, 
    sum(flag) 
    OVER (PARTITION BY acc 
     ORDER BY new_col1 
     ROWS UNBOUNDED PRECEDING) 
FROM 
(
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY acc ORDER BY col1, col2) AS new_col1, 
     CASE WHEN col1 = MIN(col1) -- col1 is sequential 
         OVER (PARTITION BY acc 
          ORDER BY col1,col2 
          ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) + 1 
      AND col2 = MIN(col2) -- col2 is sequential 
         OVER (PARTITION BY acc 
          ORDER BY col1,col2 
          ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) + 1 
      THEN 0 -- will be assigned to the previous group 
      ELSE 1 -- will be assigned to a new group 
     END AS flag 
    FROM tab AS t 
) AS dt 
0

看起来第二个新列仅仅是col1是否按顺序排列。你可以用row_number()做到这一点:

select row_number() over (partition by acc order by col1), 
     dense_rank() over (partition by acc order by grp), 
     acc, col1, col2 
from (select t.*, 
      (col1 - row_number() over (partition by acc order by col1)) as grp 
     from t 
    ) t;