SQL Определить записи, которые встречаются более одного раза в одном году - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть записи, из которых набор кодов процедур должен встречаться только один раз в год для каждого участника.Я пытаюсь определить случаи, когда это правило нарушается.Я пробовал ниже SQL, это правильно?

Таблица

+---------------+--------+-------------+
| ProcedureCode | Member | ServiceDate |
+---------------+--------+-------------+
| G0443         | 1234   | 01-03-2017  |
+---------------+--------+-------------+
| G0443         | 1234   | 05-03-2018  |
+---------------+--------+-------------+
| G0443         | 1234   | 07-03-2018  |
+---------------+--------+-------------+
| G0444         | 3453   | 01-03-2017  |
+---------------+--------+-------------+
| G0443         | 5676   | 07-03-2018  |
+---------------+--------+-------------+

Ожидаемые результаты при нарушении правила

+---------------+--------+
| ProcedureCode | Member |
+---------------+--------+
| G0443         | 1234   |
+---------------+--------+

SQL

Select ProcedureCD, Mbr_Id
From CLAIMS
Where ProcedureCD IN ('G0443', 'G0444')
GROUP BY ProcedureCD,Mbr_Id, YEAR(ServiceFromDate)
having count(YEAR(ServiceFromDate))>1

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Написанный вами запрос будет работать (если вы исправите имена столбцов - ваш запрос использует разные имена столбцов для отправленных вами образцов данных).Это может быть упрощено визуально с помощью COUNT(*) в предложении HAVING.COUNT работает с любыми ненулевыми значениями и накапливает 1 для ненулевых значений или 0 для нулевых значений, но в этом случае не имеет смысла использовать YEAR внутри счетчика, поскольку все даты не равны NULL и счетчик не заинтересован вздесь значение - count(*), count(1), count(0), count(member) будет работать одинаково

Единственное время count(column) работает иначе, чем count(*), когда column содержит нулевые значения.Существует также опция COUNT, в которой вы ставите DISTINCT в скобках, и это приводит к тому, что при подсчете игнорируются повторяющиеся значения.

COUNT DISTINCT для столбца таблицы, содержащего 6 строк значений 1, 1, 2, null, 3, 3 вернет 3 (3 уникальных значения).Если COUNT в том же столбце вернет 5 (5 ненулевых значений), COUNT (*) вернет 6

. Вы должны понимать, что, поместив ГОД (...) в группу, но не выбрав, выможет привести к появлению дублированных строк в выводе.Например, если у вас также есть эти строки:

 Member, Code, Date
1234, G0443, 1-1-19
1234, G0443, 2-1-19

И вы группируете по году (но не показываете его), тогда вы увидите:

1234, G0443    --it's for year 2018
1234, G0443    --it's for year 2019

Лично я так думаюБыло бы удобно показывать год в списке выбора, чтобы вы могли лучше определить, где проблема, но если вы хотите сжать эти дублирующиеся строки, выполните SELECT DISTINCT. Альтернативно, используйте разницу между count и count различным: удалитегод от GROUP BY и вместо этого произнесите HAVING COUNT(*) > COUNT(DISTINCT YEAR(ServiceDate))

Как обсуждалось выше, число (*) будет больше, чем число, отличное от года, если есть дублированные годы

0 голосов
/ 12 февраля 2019

Надеюсь, этот код поможет вам

create table  #temp (ProcedureCode varchar(20),Member varchar(20),ServiceDate Date)
insert into #temp (ProcedureCode,Member,ServiceDate) values ('G0443','1234','01-03-2017')
insert into #temp (ProcedureCode,Member,ServiceDate) values ('G0443','1234','05-03-2018 ')
insert into #temp (ProcedureCode,Member,ServiceDate) values ('G0443','1234','07-03-2018')
insert into #temp (ProcedureCode,Member,ServiceDate) values ('G0444','3453','01-03-2017')
insert into #temp (ProcedureCode,Member,ServiceDate) values ('G0443','5676','07-03-2018')

select ProcedureCode,Member from #temp
where YEAR(ServiceDate) in (Select year(ServiceDate) ServiceDate from #temp group by 
ServiceDate having count(ServiceDate)>1)
and Member in (Select Member from #temp group by Member having count(Member)>1)
Group by ProcedureCode,Member 

 drop table #temp

enter image description here

0 голосов
/ 12 февраля 2019
Select ProcedureCode, Member,YEAR(ServiceDate) [Year],Count(*) Occurences
From CLAIMS 
Where ProcedureCode IN ('G0443', 'G0444')
GROUP BY ProcedureCode, Member,YEAR(ServiceDate)
HAVING Count(*) > 1
...