[英]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;
您從未告訴過您您的數據庫,但是如果它支持LEFT
和RIGHT
函數,則可以使用以下更清潔的ORDER BY
:
ORDER BY RIGHT(UniqueLoc, 4), LEFT(UniqueLoc, 5) DESC
輸出:
演示在這里:
該演示在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.