Справка по SQL-запросу: выбор строк, которые появляются определенное количество раз - PullRequest
5 голосов
/ 19 сентября 2008

У меня есть таблица со столбцом «Дата». Каждая дата может появляться несколько раз. Как выбрать только те даты, которые появляются

Ответы [ 8 ]

8 голосов
/ 19 сентября 2008
SELECT * FROM [MyTable] WHERE [Date] IN
(
    SELECT [Date] 
    FROM [MyTable] 
    GROUP By [Date] 
    HAVING COUNT(*) < @Max
)

См. Также ответ @ [SQLMenace]. Это очень похоже на это, но в зависимости от вашей базы данных его JOIN, вероятно, будет работать быстрее, если предположить, что оптимизатор не имеет значения.

6 голосов
/ 19 сентября 2008
select dates 
  from table t 
 group by dates having count(dates) < k ;

Надеюсь, это работает для ORACLE. НТН

3 голосов
/ 19 сентября 2008

Использовать агрегат COUNT:

SELECT Date
FROM SomeTable
GROUP BY Date
HAVING COUNT(*) < @k
2 голосов
/ 19 сентября 2008

пример

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] 
2 голосов
/ 19 сентября 2008

Для запросов «появляется х раз» лучше всего использовать предложение 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. Индекс по дате, безусловно, улучшит производительность для этого запроса.

1 голос
/ 19 сентября 2008

Предполагается, что вы используете 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;
1 голос
/ 19 сентября 2008
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
0 голосов
/ 22 сентября 2008

Вы не сможете рассчитывать непосредственно на поле даты, если ваши даты включают в себя время. Возможно, вам сначала потребуется конвертировать в формат год / месяц / день, а затем рассчитывать на это.

В противном случае ваши отсчеты будут отключены, так как обычно очень мало записей одновременно.

...