我有一個這樣的結果集:
UserName Action
-------------------
Joe Add
Joe Remove
Fred Add
Sam Add
Carl Remove
在這種情況下,我只想回傳Addfor 。優先。所以如果用戶有一個添加記錄,我們只回傳那個喜歡的。JoeAdd
Joe Add
Fred Add
Sam Add
Carl Remove
不確定實作這一目標的最佳方法。
uj5u.com熱心網友回復:
如果您的真實示例真的像您的帖子一樣簡單,則可以考慮以下內容:
SELECT username, MIN(action) action
FROM mytable
GROUP BY username
這將回傳每個用戶名一行(因為GROUP BY)。如果混合了“添加”/“洗掉”操作,它將選擇添加(因為“添加”將是MIN)。如果只有“洗掉”操作(沒有“添加”),它將使用它。
uj5u.com熱心網友回復:
另一個選項(比 Eric 的性能低的輕推)正在使用WITH TIES
Select top 1 with ties *
From YourTable
Order By row_number() over (partition by UserName order by Action)
uj5u.com熱心網友回復:
ROW_NUMBER()我會使用 CTE 通過分配值來隔離我感興趣的行。
WITH cte AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY UserName ORDER BY Action) AS RowNum
,UserName
,Action
FROM Users
)
SELECT
UserName
,Action
FROM
cte
WHERE RowNum = 1;
這是測驗工具:
CREATE TABLE Users
([UserName] varchar(4), [Action] varchar(6))
;
INSERT INTO Users
([UserName], [Action])
VALUES
('Joe', 'Add'),
('Joe', 'Remove'),
('Fred', 'Add'),
('Sam', 'Add'),
('Carl', 'Remove')
;
這是一個SQL Fiddle
編輯:由于字母順序,ROW_NUMBER 中的 ORDER BY 子句在這里有效。如果操作串列較長,您可能需要使用 CASE 運算式強加一個順序。例如:
...ORDER BY CASE WHEN Action = 'Add' THEN 1 ELSE 2 END
無論如何,這可能是一個好主意,以確保您的排序順序不會過時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/521486.html
上一篇:varchar長度來自存盤變數?
