簡體   English   中英

等級或密集等級

[英]Rank or Dense_Rank

我正在嘗試為下面的數字分配一個“部分”。 不知道Dense_Rank是否還能工作。 基本上,它應該由seq和UniqueLoc分配。 因此,它應先查看seq 0,然后查看UniqueLoc 99137-4529,然后分配第1部分,如果UniqueLoc匹配,則移至seq 1,如果不匹配,則應分配第1部分,然后再分配第2部分。下面是我的SQL和結果:做密集的等級,但不是按我需要的順序排列。 應該是1、2、3、3

UniqueLoc   seq loadnumber  SwineMovement   sectionrow  section
99137-4529  0   304360             304360          1     2
99137-4530  1   304360             3043601         1     1
99079-4530  2   304360             3043602         1     3
99079-4530  3   304360             3043603         2     3

select *,
DENSE_RANK () over ( partition by loadnumber, uniqueloc order by   seq )   as sectionrow ,
DENSE_RANK () over (  partition by Loadnumber   order by     uniqueloc desc )   as section 
from test
order by loadnumber, seq

    UniqueLoc   seq loadnumber  SwineMovement   dr  WHAT I NEED
    99137-4529  0   304360             304360   3   1
    99137-4530  1   304360            3043601   4   2
    99079-4530  2   304360            3043602   5   3
    99079-4530  3   304360            3043603   5   3
     2519-3982  0   304468            304468    2   1
     2632-3982  1   304468           3044681    1   2
   104004-8232  0   304873            304873    8   1
    104004-8232 1   304873           3048731    8   1
   104007-8035  2   304873           3048732    6   2
    104007-8035 3   304873           3048733    6   2
    104007-8232 4   304873           3048734    7   3
    104007-8232 5   304873           3048735    7   3

我認為排序應首先在UniqueLoc列的最后四位數字升序,然后在同一列的前五位數字降序:

SELECT *,
    DENSE_RANK() OVER (PARTITION BY loadnumber
                       ORDER BY
                           SUBSTRING(UniqueLoc,
                           CHARINDEX('-', UniqueLoc) + 1,
                           LEN(UniqueLoc) - CHARINDEX('-', UniqueLoc)),
                           SUBSTRING(UniqueLoc, 1, CHARINDEX('-', UniqueLoc) - 1) DESC) dr
FROM test
ORDER BY
    loadnumber, seq;

您從未告訴過您您的數據庫,但是如果它支持LEFTRIGHT函數,則可以使用以下更清潔的ORDER BY

ORDER BY RIGHT(UniqueLoc, 4), LEFT(UniqueLoc, 5) DESC

輸出:

在此處輸入圖片說明

演示在這里:

Rextester

該演示在SQL Server中進行,因為我認為您的select *語法在Oracle上將失敗,而Postgres可能是唯一的其他候選者。

根據您的預期結果,排序將始終在seq列上

SELECT uniqueloc,
       seq,
       loadnumber,
       swinemovement,
       DENSE_RANK() OVER (PARTITION BY loadnumber 
                              ORDER BY CASE WHEN seq<> rnum
                                            THEN CONCAT(CAST(seq-rnum AS VARCHAR),uniqueloc)
                                            ELSE uniqueloc
                                        END) [rank]
  FROM (SELECT *,
               (ROW_NUMBER() OVER (PARTITION BY loadnumber 
                                       ORDER BY uniqueloc) - 1) rnum
          FROM t_load
       ) t
 ORDER BY loadnumber, 
          seq;

結果(我添加了測試數據加載號900000以檢查排名是否仍然適用於其他情況)

uniqueloc   seq loadnumber  swinemovement   rank
99137-4529  0   304360      304360          1
99137-4530  1   304360      3043601         2
99079-4530  2   304360      3043602         3
99079-4530  3   304360      3043603         3
2519-3982   0   304468      304468          1
2632-3982   1   304468      3044681         2
104004-8232 0   304873      304873          1
104004-8232 1   304873      3048731         1
104007-8035 2   304873      3048732         2
104007-8035 3   304873      3048733         2
104007-8232 4   304873      3048734         3
104007-8232 5   304873      3048735         3
99137-4529  0   900000      304360          1
99079-4530  1   900000      3043601         2
99079-4530  2   900000      3043602         2
99137-4530  3   900000      3043603         3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM