行号()订单问题
如果事先已经问过这个特定的情况,但是我似乎无法让这些订单正确订购(这可能是因为盯着它太久)。行号()订单问题
我使用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进行了排序 - 但只有在按字母顺序需要时才有效。
在此先感谢。
假设国家与分组一致,你已经证明;如果您在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
我认为这将工作 - 只是一个小的变化 - 而不是min(seq_no)和m.country在连接 - 使用desc1代替国家,并重新加入m.desc1 = mintbl.desc1和m.department = mintbl.department将让我在那里。谢谢你的帮助! –
你想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
。
谢谢 - 这会让我更接近,但按字母顺序排列desc1,而不是保持seq_no的顺序。 –
不能使用
dense_rank() over(partition by department, desc1 order by beg_date)
或者......
dense_rank() over(partition by department,desc1 order by seq_no)
这在desc1按字母顺序排列的sens中起作用 - 而不是seq_no或beg_date。我想过连接seq_no和desc1,但我遇到了同样的问题。 –
如果您的SEQ_NO按字母顺序排列,那么它可能被存储为一个字符串,如果它只包含一个序列,那么这是一个坏主意......您可能可以通过cast来修复它:....按SEQ_NO :: integer排序。 ..但假设该列只包含10位[0-9] –
使用'DENSE_RANK()',而不是'ROW_NUMBER()' –
这越来越近,但我需要保持整体seq_no或beg_date顺序 - 只要DESC1下令采取整体秩序脱节。 –
提供预期的结果 –