是否先按SQL Server分组,然后取消分组?

是否先按SQL Server分组,然后取消分组?,sql,sql-server,group-by,Sql,Sql Server,Group By,我有一个需要分组的数据列表,但我们只希望分组计数大于3的数据 AA AA BB CCC CCC CCC 返回 AA 1 AA 1 BB 1 CCC 3 感谢您的帮助在我的脑海中,您可以使用“获取计数大于2的所有内容的计数”,然后使用“联合所有”来获取第一次查询中未包含的任何记录: SELECT 'AA' AS Data INTO #Temp UNION ALL SELECT 'AA' UNION ALL SELECT 'BB' UNION ALL SELECT 'CCC' UNION

我有一个需要分组的数据列表,但我们只希望分组计数大于3的数据

AA
AA
BB
CCC
CCC
CCC
返回

AA  1
AA  1
BB  1
CCC 3

感谢您的帮助

在我的脑海中,您可以使用“获取计数大于2的所有内容的计数”,然后使用“联合所有”来获取第一次查询中未包含的任何记录:

SELECT 'AA' AS Data
INTO #Temp
UNION ALL SELECT 'AA'
UNION ALL SELECT 'BB'
UNION ALL SELECT 'CCC'
UNION ALL SELECT 'CCC'
UNION ALL SELECT 'CCC'

SELECT Data, COUNT(Data) AS MyCount
FROM #Temp
GROUP BY Data
HAVING COUNT(Data) > 2

UNION ALL

SELECT Data, 1
FROM #Temp
WHERE Data NOT IN (
    SELECT Data
    FROM #Temp
    GROUP BY Data
    HAVING COUNT(Data) > 2
)
ORDER BY Data

DROP TABLE #Temp

在我看来,您可以使用一个大于2的“获取所有内容的计数”,然后使用UNION ALL来获取第一次查询中没有的任何记录:

SELECT 'AA' AS Data
INTO #Temp
UNION ALL SELECT 'AA'
UNION ALL SELECT 'BB'
UNION ALL SELECT 'CCC'
UNION ALL SELECT 'CCC'
UNION ALL SELECT 'CCC'

SELECT Data, COUNT(Data) AS MyCount
FROM #Temp
GROUP BY Data
HAVING COUNT(Data) > 2

UNION ALL

SELECT Data, 1
FROM #Temp
WHERE Data NOT IN (
    SELECT Data
    FROM #Temp
    GROUP BY Data
    HAVING COUNT(Data) > 2
)
ORDER BY Data

DROP TABLE #Temp
在大多数情况下,这应该比LittleBobbyTables的答案执行得更快


在大多数情况下,这应该比LittleBobbyTables的答案执行得更快。

为此使用窗口功能:

select col, count(*) as cnt
from (select col, count(*) over (partition by col) as colcnt,
             row_number() over (order by (select NULL)) as seqnum
      from t
     ) t
 group by col, (case when colcnt < 3 then seqnum else NULL end)

这将计算列的总计数和每行的唯一标识符。然后,GROUPBY子句测试该条件。如果小于3,则使用标识符获取每一行。如果较大,则在这种情况下使用常量值NULL。

使用窗口函数:

select col, count(*) as cnt
from (select col, count(*) over (partition by col) as colcnt,
             row_number() over (order by (select NULL)) as seqnum
      from t
     ) t
 group by col, (case when colcnt < 3 then seqnum else NULL end)

这将计算列的总计数和每行的唯一标识符。然后,GROUPBY子句测试该条件。如果小于3,则使用标识符获取每一行。如果大于,则在本例中使用常量值NULL。

我想我需要在这里进行更多操作-因此,您有一个字符串列表,您只想显示长度大于3的字符串?或者出现三次以上?或者两者都有?我想我需要更多的东西,所以,你有一个字符串列表,你只想显示长度大于3的字符串?或者出现三次以上?或者两者都有?