使用带有附加过滤器的 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 只取值12

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)
                );

如果还有其他状态值并且你特别关心12,你会使用:

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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pandas 中使用过滤条件和 groupby

Spring Security +自定义用户对象附加到会话以过滤请求

使用 groupby 的结果过滤 pandas 数据框

使用 groupby 计数的 Spark 过滤数据

熊猫 groupby 和过滤器

html AngularJS groupBy过滤器