我正在使用SQL Server。
我有一張這樣的桌子:
| 鑰匙 | 規則名稱 | Rule_Order |
|---|---|---|
| 鍵1 | 對講機 | 12 |
| 鍵1 | 對講機 | 12 |
| 鍵1 | 增值稅 | 15 |
| 鍵1 | 對講機 | 12 |
| 鍵1 | 增值稅 | 15 |
| 鍵1 | 增值稅 | 15 |
我正在尋找這個:
| 鑰匙 | 規則名稱 |
|---|---|
| 鍵1 | 對講機 |
換句話說,我需要按鍵分組并獲取與Rule_Order的最小值匹配的規則名稱。
一開始,我是這么想的:
select [Key], [Rule_Name]
from (
select [Key],
min([Rule_Order]),
min([Rule_Name])
from
mytable
group by [Key]
)
這適用于上面的示例,但是 min([Rule_Name]) 將查找按字母順序排在第一位的Rule_Name。
如果我像這樣更改規則順序:
| 鑰匙 | 規則名稱 | Rule_Order |
|---|---|---|
| 鍵1 | 對講機 | 12 |
| 鍵1 | 對講機 | 12 |
| 鍵1 | 增值稅 | 10 |
| 鍵1 | 對講機 | 12 |
| 鍵1 | 增值稅 | 10 |
| 鍵1 | 增值稅 | 10 |
那么上面的查詢會給我這個:
| 鑰匙 | 規則名稱 |
|---|---|
| 鍵1 | 對講機 |
這不是我想要的,因為增值稅與最小的規則順序相關聯。
我知道“interco”這個詞在字母表中出現在“VAT”之前。我天真地認為聚合器的順序在組中很重要:使用 min([Rule_Order]) 列出最小順序的第一個規則,然后檢索與此順序關聯的規則名稱。就我而言,因為總是有一個規則與給定的訂單相關聯,所以我認為使用 min 或 max 并不重要。但它變成了錯誤的。
那么在這種情況下查詢應該是什么樣子呢?
謝謝!
uj5u.com熱心網友回復:
我們可以在子查詢或 cte 中使用 row_number。
create table t( Key_ varchar(10), Rule_Name varchar(10), Rule_Order int); insert into t values ('Key1','interco',12), ('Key1','interco',12), ('Key1','VAT',10), ('Key1','interco',12), ('Key1','VAT',10), ('Key1','VAT',15), ('Key2','test',5);
select key_, rule_name from (select key_, rule_name, row_number() over (partition by key_ order by rule_order) rn from t) as sq where rn = 1; GO關鍵_ | 規則名稱 :--- | :-------- 鍵1 | 增值稅 鍵2 | 測驗
db<>在這里擺弄
uj5u.com熱心網友回復:
該函式FIRST_VALUE完全符合我們的要求。
create table t( Key_ varchar(10), Rule_Name varchar(10), Rule_Order int); insert into t values ('Key1','interco',12), ('Key1','interco',12), ('Key1','VAT',10), ('Key1','interco',12), ('Key1','VAT',10), ('Key1','VAT',15), ('Key2','test',5);
select distinct key_, first_value(rule_name) over (partition by key_ order by rule_order) as rule_name from t; GO關鍵_ | 規則名稱 :--- | :-------- 鍵1 | 增值稅 鍵2 | 測驗
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/467831.html
標籤:sql服务器
上一篇:NOTIN與連接列
下一篇:SQLServer權限鏈
