Справка по SQL-запросу:Выбор строк, которые появляются Определенное Количество раз

StackOverflow https://stackoverflow.com/questions/104971

  •  01-07-2019
  •  | 
  •  

Вопрос

У меня есть таблица со столбцом "Дата".Каждая дата может отображаться несколько раз.Как мне выбрать только те даты, которые отображаются < k раз?

Это было полезно?

Решение

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

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

Другие советы

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

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

Используйте совокупный показатель COUNT:

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

пример

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] 

Для запросов "появляется 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 во ВНУТРЕННЕЕ СОЕДИНЕНИЕ, однако это не даст прироста производительности, поскольку, фактически, оптимизатор запросов сделает это за вас в большинстве СУБД.Наличие индекса по дате, безусловно, повысит производительность этого запроса.

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;

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top