使用带有附加过滤器的 Groupby
Posted
技术标签:
【中文标题】使用带有附加过滤器的 Groupby【英文标题】:Using Groupby with additional filter 【发布时间】:2021-07-11 02:59:44 【问题描述】:我有初始格式的数据:
第 1 步:找出拥有超过 1 条记录的用户并显示这些记录。这是使用以下方法实现的。
SELECT ID,
USER,
STATUS
FROM TABLE
WHERE USER in
(SELECT USER
FROM TABLE
GROUP BY USER
HAVING COUNT(*) > 1)
*第 2 步:从上述记录集中找出所有值为 1 或 2 的记录。SO 数据应类似于:
我能否就如何实现这一目标提出一些建议。注意状态为NVARCHAR
,因此不能使用聚合函数。
【问题讨论】:
根据问题指南,请不要发布代码、数据、错误消息等的图像 - 复制或键入问题中的文本。请保留将图像用于图表或演示渲染错误,这些无法通过文本准确描述的事情。请展示您尝试过的内容,并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。 没有 count(*) in (1,2) 不起作用? 您可能需要将您的状态转换为数值 - 理想情况下,您一开始不会将其存储为字符串。 【参考方案1】:最简单的方法是检查子查询中的状态是否相同。假设status
只取值1
和2
:
SELECT t.ID, t.USER, t.STATUS
FROM TABLE
WHERE t.USER IN (SELECT t2.USER
FROM TABLE t2
GROUP BY t2.USER
HAVING COUNT(*) > 1 AND
MIN(t2.status) = MAX(t2.status)
);
如果还有其他状态值并且你特别关心1
和2
,你会使用:
SELECT t.ID, t.USER, t.STATUS
FROM TABLE
WHERE t.USER IN (SELECT t2.USER
FROM TABLE t2
GROUP BY t2.USER
HAVING COUNT(*) > 1 AND
MIN(t2.status) = MAX(t2.status) AND
MIN(t2.status) IN (1, 2)
);
【讨论】:
【参考方案2】:请检查是否有帮助
SELECT ID,
[USER],
[STATUS]
FROM TABLE
WHERE [USER] in
(SELECT [USER]
FROM TABLE
GROUP BY [USER]
HAVING COUNT([USER]) > 1 AND ((MIN(STATUS) != MAX(STATUS) AND COUNT(STATUS) > 2) OR (MIN(STATUS) = MAX(STATUS))))
【讨论】:
以上是关于使用带有附加过滤器的 Groupby的主要内容,如果未能解决你的问题,请参考以下文章