Как мне сделать запрос SQL, который возвращает записи, только если на дату есть несколько записей? - PullRequest
0 голосов
/ 04 октября 2018

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

Как создать запрос SQL, который извлекает только те записи, для которых существует несколько транзакций для этой компании на одну и ту же дату?

Он должен исключать любые транзакцииесли на эту дату есть только одна запись для этой компании.Возможно ли это в SQL?

Ответы [ 4 ]

0 голосов
/ 04 октября 2018
WITH RECORDS AS (
  SELECT company
  FROM table
  GROUP BY company, date
  HAVING COUNT(0)>1
)
SELECT company[, ...]
FROM table
WHERE company IN (SELECT company From RECORDS)
  • Запрос в 'with ... as ...' вернет все строки, которые имеют ту же компанию и дату, что и другая строка
  • Второй запрос затем выбираетданные, которые вы действительно хотите получить из каждой строки, возвращаемой в первом запросе.Это сделано для того, чтобы вы не ограничивались возвратом только того, что сгруппировано.
  • Причина, по которой он помещается в 'with ... as ...' вместо того, чтобы помещаться в последнийselect вызван тем, что оператор select в операторе 'where' будет вызываться для каждой строки, поэтому более эффективно обрабатывать все дублированные записи один раз, а затем просто просматривать эти идентификаторы
0 голосов
/ 04 октября 2018
    SELECT *  FROM TRANSACTION_DETAILS
 WHERE (COMPANY_ID, TRUNC (TRANSACTION_TIME)) IN
          (  SELECT COMPANY_ID, TRUNC (TRANSACTION_TIME)
               FROM TRANSACTION_DETAILS
           GROUP BY COMPANY_ID, TRUNC (TRANSACTION_TIME)
             HAVING COUNT (*) > 1)
             order by COMPANY_ID,TRANSACTION_TIME

внутренний запрос находит компании с более чем одной транзакцией в день (несколько транзакций для этой компании в одну и ту же дату).Внешний запрос извлекает эти транзакции для компаний только в те дни.

0 голосов
/ 04 октября 2018

использовать group by с count() функцией

SELECT company, date
    FROM t
group by company, date
having COUNT(*)>1

Примечание: здесь столбец даты транзакции должен иметь тип данных даты, если это время даты, тогда ему нужно будет преобразовать тип даты

0 голосов
/ 04 октября 2018

Мы можем попробовать использовать COUNT в качестве аналитической функции:

SELECT *
FROM
(
    SELECT *, COUNT(*) OVER (PARTITION BY company, date) cnt
    FROM yourTable
) t
WHERE cnt > 1;
...