「日付」列を持つテーブルがあります。各日付は複数回表示される場合があります。出現回数が k 回未満の日付のみを選択するにはどうすればよいですか?
8 に答える
SELECT * FROM [MyTable] WHERE [Date] IN
(
SELECT [Date]
FROM [MyTable]
GROUP By [Date]
HAVING COUNT(*) < @Max
)
@[SQLMenace] の応答も参照してください。これと非常に似ていますが、データベースによっては、オプティマイザーが違いを無意味にしないと仮定すると、彼の JOIN はおそらくより高速に実行されます。
select dates
from table t
group by dates having count(dates) < k ;
うまくいけば、それは ORACLE で動作します。HTH
COUNT 集計を使用します。
SELECT Date
FROM SomeTable
GROUP BY Date
HAVING COUNT(*) < @k
"appears x times" クエリの場合、HAVING 句を使用するのが最適です。あなたの場合、クエリは次のようになります。
SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k
または、日付以外の他の列を選択する必要がある場合:
SELECT * FROM Table WHERE Date IN (
SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k)
IN を INNER JOIN に書き換えることもできますが、実際にはクエリ オプティマイザーがほとんどの RDBMS でこれを行うため、パフォーマンスは向上しません。Date にインデックスを設定すると、このクエリのパフォーマンスが確実に向上します。
例
DECLARE @Max int
SELECT @Max = 5
SELECT t1.*
FROM [MyTable] t1
JOIN(
SELECT [Date]
FROM [MyTable]
GROUP By [Date]
HAVING COUNT(*) < @Max
) t2 on t1.[Date] = t2.[Date]
SELECT date, COUNT(date)
FROM table
GROUP BY date
HAVING COUNT(date) < k
そして、元のデータを取り戻すには:
SELECT table.*
FROM table
INNER JOIN (
SELECT date, COUNT(date)
FROM table
GROUP BY date
HAVING COUNT(date) < k) dates ON table.date = dates.date
Oracle を使用していると仮定すると、k = 5:-
select date_col,count(*)
from your_table
group by date_col
having count(*) < 5;
日付列にも時間が入力されていて、それを無視したい場合は、クエリを次のように変更します。
select trunc(date_col) as date_col,count(*)
from your_table
group by trunc(date_col)
having count(*) < 5;
日付に時間が含まれている場合、日付フィールドで直接カウントできない場合があります。最初に年/月/日の形式に変換してから、それを考慮に入れる必要がある場合があります。
そうしないと、通常、まったく同じ時刻のレコードがほとんどないため、カウントがオフになります。