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

时间:2008-09-19 19:51:57

标签: sql date select

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

8 个答案:

答案 0 :(得分:8)

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

另见@ [SQLMenace]的回复。它与此非常相似,但是根据您的数据库,他的JOIN可能会运行得更快,假设优化器不会产生差异。

答案 1 :(得分:5)

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

希望它适用于ORACLE。 HTH

答案 2 :(得分:3)

使用COUNT聚合:

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

答案 3 :(得分:2)

对于“出现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中为您执行此操作。在Date上拥有索引肯定会提高此查询的性能。

答案 4 :(得分:2)

例如

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] 

答案 5 :(得分:1)

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

答案 6 :(得分:1)

假设您使用的是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;

答案 7 :(得分:0)

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

否则你的计数将被取消,因为通常只有非常少的记录具有完全相同的时间。