我有以下表格,我想用 null 或不為 null 來區分每個 cols。
priority1 priority2 priority3 ...
a a null
a null null
null null null
a null a
a a null
null a a
null null a
null a a
所以我想要的結果是這樣的,我想設定優先級,我想添加priority_rank如下。
priority1 priority2 priority3 ... priority_rank
a a a 1
a a null 2
a null a 3
a null null 4
null a a 5
null a null 6
null null a 7
null null null 8
我試著跟隨。
select case
when priority1 is not null and priority2 is not null and priority3 is not null then priority_rank=1,
when priority1 is not null and priority2 is not null and priority3 is null then priority_rank=2,
???
但我擔心的是,當優先級列增加時,這種情況會成倍增加,所以從現在開始需要 2^^3 = 8 個選擇子句。
有沒有簡單的方法來實作這一點?
如果有人有意見,請告訴我。謝謝
uj5u.com熱心網友回復:
您可以使用以下DENSE_RANK()功能:
Select priority1, priority2, priority3,
DENSE_RANK() Over (Order By Case When priority1 IS NOT null Then 1 End,
Case When priority2 IS NOT null Then 1 End,
Case When priority3 IS NOT null Then 1 End
) priority_rank
From table_name
查看演示。
請注意,空值按默認升序排列在最后。
uj5u.com熱心網友回復:
假設優先級列中可以有不同的值,值越高,整體優先級越高,并且優先級值相同的行在priority_rank結果中應該有相同的值,你可以使用DENSE_RANKwith ORDER BYfor所有優先級值按降序排列。由于 PostgreSQLNULLS LAST默認使用升序排列,因此降序排列的NULL值會首先出現。為了防止這種情況,您需要添加NULLS LAST到所有訂單陳述句。
最后,您的查詢可能如下所示
select
*,
dense_rank() over (
order by priority1 desc nulls last,
priority2 desc nulls last,
priority3 desc nulls last
) priority_rank
from priorities
對于您提供的示例資料,輸出為
| 優先級1 | 優先級2 | 優先級3 | 優先級 |
|---|---|---|---|
| 一個 | 一個 | 無效的 | 1 |
| 一個 | 一個 | 無效的 | 1 |
| 一個 | 無效的 | 一個 | 2 |
| 一個 | 無效的 | 無效的 | 3 |
| 無效的 | 一個 | 一個 | 4 |
| 無效的 | 一個 | 一個 | 4 |
| 無效的 | 無效的 | 一個 | 5 |
| 無效的 | 無效的 | 無效的 | 6 |
db<>在這里擺弄
uj5u.com熱心網友回復:
很抱歉,我能夠使用非常基本的 ANSI SQL 在 SSMS 上創建它,所以我認為它可能會起作用。如果添加更多列,它仍然需要一些維護。
SELECT
*
, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS PRIORITY_RANK
FROM
(
SELECT
Priority1
, Priority2
, Priority3
, ISNULL(LEN(Priority1),0) ISNULL(LEN(Priority2),0) ISNULL(LEN(Priority3),0) AS TotalPriority
FROM PriorityTableTest
) AS X
ORDER BY TotalPriority DESC, Priority1 DESC, Priority2 DESC, Priority3 DESC
uj5u.com熱心網友回復:
ORDER BY ROW_NUMBER() OVER()排序和分配排名
SELECT *
, ROW_NUMBER() OVER(ORDER BY priority1 IS NULL,priority2 IS NULL,priority3 IS NULL) AS priority_rank
FROM table_name
ORDER BY priority1 IS NULL, priority2 IS NULL, priority3 IS NULL
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/504862.html
標籤:sql PostgreSQL
