グループ化する必要があるデータのリストがありますが、カウントが 3 より大きいデータのみをグループ化したいと考えています。
AA
AA
BB
CCC
CCC
CCC
戻る
AA 1
AA 1
BB 1
CCC 3
ご協力ありがとうございました
グループ化する必要があるデータのリストがありますが、カウントが 3 より大きいデータのみをグループ化したいと考えています。
AA
AA
BB
CCC
CCC
CCC
戻る
AA 1
AA 1
BB 1
CCC 3
ご協力ありがとうございました
select data, case when total < 3 then 1 else total end total
from
(
select data, Count(Data) Total
from tbl
group by data
) g
join (select 1 union all select 2) a(b)
on a.b <= case when total < 3 then Total else 1 end
order by data
ほとんどの場合、これは LittleBobbyTables の回答よりも高速に実行されるはずです。
私の頭の上から、カウントが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
これにはウィンドウ関数を使用します。
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)を使用します。