行号()订单问题

时间:2017-09-26 15:28:17

标签: sql oracle tsql netezza row-number

如果先前已经询问过这个具体情况,请提前道歉,但我似乎无法正确地订购这些情况(可能是因为长时间盯着它)。

我正在使用Netezza / Oracle,并且在下面的数据集中 - 我基本上需要order_num来产生1,2,2,2,2,3,4(基本上分组Department和Desc1(desc1不是唯一的)因为每年都有不同的代码,但我只对这种类型感兴趣,而不是年份。)其他尝试中,我尝试过:

  

row_number()over(由desc1按部门顺序划分)order_num

按字母顺序排序。我也是通过seq_no和desc1订购的 - 但只有在我按字母顺序需要它时才有效。

提前致谢。

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:1)

您需要dense_rank()而不是row_number()

dense_rank() over (partition by a.department order by desc1) order_num

如果要维护seqnum订单,可以使用子查询来计算:

min(seqnum) over (partition by department, desc1) as min_seqnum

然后在外部查询中使用min_seqnum作为order by

答案 1 :(得分:1)

假设国家与您所显示的分组一致;如果在CTE或子查询中获得每个国家/地区的最小seq_no,则可以在dense_rank函数中使用此值,例如

    SELECT 
       m.Department,
       m.Desc1,
       m.seq_no,
       m.Country,
       m.beg_date,
       m.end_date,
       dense_rank() OVER(PARTITION BY m.Department ORDER BY mintbl.MinSeq) 
FROM dbo.mytable AS m
JOIN ( SELECT min(m.seq_no) AS MinSeq,
               m.Department,
                         m.Country
        FROM dbo.mytable AS m
        GROUP BY m.Department,m.Country
     ) AS mintbl ON mintbl.Department = m.Department AND mintbl.Country = m.Country
ORDER BY m.seq_no

答案 2 :(得分:0)

你能否使用

dense_rank() over(partition by department, desc1 order by beg_date)

或者...

dense_rank() over(partition by department,desc1 order by seq_no)