我有一个这样的结果集:
UserName Action
-------------------
Joe Add
Joe Remove
Fred Add
Sam Add
Carl Remove
在这种情况下,我只想返回Joe
的Add
。Add
优先。因此,如果用户有一个add记录,我们只返回like。
Joe Add
Fred Add
Sam Add
Carl Remove
不确定最好的方法来完成这一点。
我有一个这样的结果集:
UserName Action
-------------------
Joe Add
Joe Remove
Fred Add
Sam Add
Carl Remove
在这种情况下,我只想返回Joe
的Add
。Add
优先。因此,如果用户有一个add记录,我们只返回like。
Joe Add
Fred Add
Sam Add
Carl Remove
不确定最好的方法来完成这一点。
3条答案
按热度按时间3lxsmp7m1#
如果你的真实的例子真的和你的帖子一样简单,也许可以考虑这样的东西:
这将为每个用户名返回一行(因为
GROUP BY
)。如果有一些“Add”/“Remove”操作的混合,它将选择add(因为“Add”将是MIN
)。如果只有“Remove”操作(没有“Add“),它将使用该操作。qacovj5a2#
还有一种选择(性能比Eric的稍差)是使用
WITH TIES
lmyy7pcs3#
我将使用CTE通过分配
ROW_NUMBER()
值来隔离我感兴趣的行。下面是测试工具:
下面是一个SQL小提琴
编辑:ROW_NUMBER中的ORDER BY子句在此处有效,因为它是按字母顺序排列的。如果操作列表较长,则可能需要使用CASE表达式来强制排序。例如:
这可能是一个好主意,无论如何,以证明未来的排序顺序。