sql-server 仅当特定用户是“重复”且满足条件时才选择该用户

avkwfej4  于 2022-10-31  发布在  其他
关注(0)|答案(3)|浏览(134)

我有一个这样的结果集:

UserName   Action
-------------------
Joe        Add
Joe        Remove
Fred       Add
Sam        Add
Carl       Remove

在这种情况下,我只想返回JoeAddAdd优先。因此,如果用户有一个add记录,我们只返回like。

Joe   Add
Fred  Add
Sam   Add
Carl  Remove

不确定最好的方法来完成这一点。

3lxsmp7m

3lxsmp7m1#

如果你的真实的例子真的和你的帖子一样简单,也许可以考虑这样的东西:

SELECT username, MIN(action) action
FROM mytable
GROUP BY username

这将为每个用户名返回一行(因为GROUP BY)。如果有一些“Add”/“Remove”操作的混合,它将选择add(因为“Add”将是MIN)。如果只有“Remove”操作(没有“Add“),它将使用该操作。

qacovj5a

qacovj5a2#

还有一种选择(性能比Eric的稍差)是使用WITH TIES

Select top 1 with ties * 
 From  YourTable
 Order By row_number() over (partition by UserName order by Action)
lmyy7pcs

lmyy7pcs3#

我将使用CTE通过分配ROW_NUMBER()值来隔离我感兴趣的行。

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小提琴
编辑:ROW_NUMBER中的ORDER BY子句在此处有效,因为它是按字母顺序排列的。如果操作列表较长,则可能需要使用CASE表达式来强制排序。例如:

...ORDER BY CASE WHEN Action = 'Add' THEN 1 ELSE 2 END

这可能是一个好主意,无论如何,以证明未来的排序顺序。

相关问题