SQL查询帮助:选择出现一定次数的行

时间:2020-03-06 14:27:35  来源:igfitidea点击:

我有一个带有"日期"列的表。每个日期可能会出现多次。如何仅选择出现<k次的日期?

解决方案

SELECT * FROM [MyTable] WHERE [Date] IN
(
    SELECT [Date] 
    FROM [MyTable] 
    GROUP By [Date] 
    HAVING COUNT(*) < @Max
)

另请参见@ [SQLMenace]的响应。与此非常相似,但是根据数据库,假设优化程序没有什么不同,他的JOIN可能会运行得更快。

使用COUNT个汇总:

SELECT Date
FROM SomeTable
GROUP BY Date
HAVING COUNT(*) < @k

对于"出现x次"查询,最好使用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中为我们完成此操作。在日期上具有索引肯定会提高此查询的性能。

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;

select dates 
  from table t 
 group by dates having count(dates) < k ;

希望它适用于ORACLE。
高温超导

例子

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]

如果日期包含时间,则可能无法直接在日期字段上进行计数。我们可能需要先转换为仅年/月/日格式,然后再进行计算。

否则,计数就会消失,因为通常只有很少的时间完全相同的记录。