【问题标题】:Using Groupby with additional filter使用带有附加过滤器的 Groupby
【发布时间】: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) 不起作用?
  • 您可能需要将您的状态转换为数值 - 理想情况下,您一开始不会将其存储为字符串。

标签: sql sql-server tsql group-by


【解决方案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))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多