2017-09-26 131 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] –