Как удалить неточные дубликаты на SQL сервере - PullRequest
1 голос
/ 17 марта 2020

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

Тем не менее, как дело может быть открыто в течение нескольких месяцев, я хочу только хочу, чтобы первый месяц он появился. например, дело может быть открыто в каждом отчете 201904, 201905, а затем вновь открыто в 201911, много информации об этом случае изменяется, поэтому его нет точно дублировать, однако я только после данных для дела в отчете 201904.

В настоящее время я использую следующий код

Select ReportDate, CaseNo, Est, CaseType
From output.casedata
Where casetype='family' and Status='Open' AND (
  Reportdate='201903' OR Reportdate='201904' OR Reportdate='201905'
  or Reportdate='201906' or Reportdate='201907' or Reportdate='201908'
  or Reportdate='201909' or Reportdate='201910' or Reportdate='201911'
  or Reportdate='201912' or Reportdate='202001' or Reportdate='202002'
)

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Если Я следовал за вами правильно, вам нужна самая ранняя открытая запись для каждого случая.

Следующее должно соответствовать ожидаемому:

select c.*
from output.casedata c
where c.reportdate = (
    select min(c1.reportdate)
    where 
        c1.caseno = c.caseno
        and c1.casetype = 'family' 
        and c1.status = 'open' 
        and c1.reportdate between '201903' and '202002'
)

Для производительности: вам нужен индекс для (caseno, casttype, status, reportdate).

Обратите внимание, что я упростил ie фильтр для reportdate, чтобы использовать between вместо перечисления всех возможных значений.

0 голосов
/ 17 марта 2020

Вы можете использовать оконную функцию rank, чтобы найти строку с первой датой для номера дела, а затем извлечь из нее все детали:

SELECT *
FROM   (SELECT *, RANK() OVER (PARTITION BY CaseNo ORDER BY Reportdate) AS rk
        FROM   output.casedata
        WHERE  casetype = 'family' AND status='Open') t
WHERE  rk = 1
...