2017-09-26 107 views
1

如果事先已经问过这个特定的情况,但是我似乎无法让这些订单正确订购(这可能是因为盯着它太久)。行号()订单问题

我使用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进行了排序 - 但只有在按字母顺序需要时才有效。

在此先感谢。

enter image description here

enter image description here

+4

使用'DENSE_RANK()',而不是'ROW_NUMBER()' –

+0

这越来越近,但我需要保持整体seq_no或beg_date顺序 - 只要DESC1下令采取整体秩序脱节。 –

+0

提供预期的结果 –

回答

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 
+0

我认为这将工作 - 只是一个小的变化 - 而不是min(seq_no)和m.country在连接 - 使用desc1代替国家,并重新加入m.desc1 = mintbl.desc1和m.department = mintbl.department将让我在那里。谢谢你的帮助! –

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

+0

谢谢 - 这会让我更接近,但按字母顺序排列desc1,而不是保持seq_no的顺序。 –

0

不能使用

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

或者......

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

这在desc1按字母顺序排列的sens中起作用 - 而不是seq_no或beg_date。我想过连接seq_no和desc1,但我遇到了同样的问题。 –

+0

如果您的SEQ_NO按字母顺序排列,那么它可能被存储为一个字符串,如果它只包含一个序列,那么这是一个坏主意......您可能可以通过cast来修复它:....按SEQ_NO :: integer排序。 ..但假设该列只包含10位[0-9] –