我有一个带有“日期”列的表。每个日期可能出现多次。如何仅选择出现 < k 次的日期?
Jake
问问题
5030 次
8 回答
8
SELECT * FROM [MyTable] WHERE [Date] IN
(
SELECT [Date]
FROM [MyTable]
GROUP By [Date]
HAVING COUNT(*) < @Max
)
另请参阅 @[SQLMenace] 的回复。它与此非常相似,但根据您的数据库,他的 JOIN 可能会运行得更快,假设优化器不会产生影响。
于 2008-09-19T19:53:22.740 回答
6
select dates
from table t
group by dates having count(dates) < k ;
希望它适用于 ORACLE。高温高压
于 2008-09-19T19:55:45.057 回答
3
使用 COUNT 聚合:
SELECT Date
FROM SomeTable
GROUP BY Date
HAVING COUNT(*) < @k
于 2008-09-19T19:54:46.637 回答
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 上有索引肯定会提高此查询的性能。
于 2008-09-19T19:54:48.883 回答
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]
于 2008-09-19T19:56:17.317 回答
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
于 2008-09-19T19:54:56.307 回答
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;
于 2008-09-19T19:55:10.347 回答
0
如果您的日期包括时间,您可能无法直接在日期字段上进行计数。您可能需要先转换为年/月/日格式,然后再计算。
否则,您的计数将被取消,因为通常很少有记录具有完全相同的时间。
于 2008-09-22T15:06:36.087 回答