Row Number() 订单问题
Row Number() Order Issue
如果之前有人问过这个特定的场景,请提前致歉,但我似乎无法正确排序(这可能是因为盯着它看太久了)。
我正在使用 Netezza/Oracle,在下面的数据集中 - 我基本上需要 order_num 来得到 1,2,2,2,2,3,4(基本上分组Department 和 Desc1(desc1 不是唯一的,因为每年都有不同的代码,但我只对类型感兴趣,而不是年份。)在其他尝试中,我尝试过:
row_number () over (partition by a.department order by desc1) order_num
按字母顺序排列。我还按 seq_no 和 desc1 订购了 - 但只有在我需要按字母顺序排列时才有效。
提前致谢。
你想要 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
。
能不能不用
dense_rank() over(partition by department, desc1 order by beg_date)
或者...
dense_rank() over(partition by department,desc1 order by seq_no)
假设国家与您显示的分组一致;如果您在 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
如果之前有人问过这个特定的场景,请提前致歉,但我似乎无法正确排序(这可能是因为盯着它看太久了)。
我正在使用 Netezza/Oracle,在下面的数据集中 - 我基本上需要 order_num 来得到 1,2,2,2,2,3,4(基本上分组Department 和 Desc1(desc1 不是唯一的,因为每年都有不同的代码,但我只对类型感兴趣,而不是年份。)在其他尝试中,我尝试过:
row_number () over (partition by a.department order by desc1) order_num
按字母顺序排列。我还按 seq_no 和 desc1 订购了 - 但只有在我需要按字母顺序排列时才有效。
提前致谢。
你想要 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
。
能不能不用
dense_rank() over(partition by department, desc1 order by beg_date)
或者...
dense_rank() over(partition by department,desc1 order by seq_no)
假设国家与您显示的分组一致;如果您在 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