Возникли проблемы при разработке SQL-запроса, который даст мне желаемый результат - PullRequest
0 голосов
/ 20 сентября 2019

Итак, у меня есть таблица, которая выглядит примерно так:

ReferralId   EpisodeId     DateOfReferral    Hospital
1            1             20/04/2019        1
2            1             21/04/2019        2
3            2             28/04/2019        2
4            2             24/04/2019        3
5            2             24/04/2019        1
6            3             22/04/2019        1
7            3             24/04/2019        4

Я пытаюсь запросить эту таблицу, чтобы вернуть EpisodeIds, которые имеют более одного реферала на одну и ту же дату, НО эти два реферала имеютразные больницы.Таким образом, результат для приведенной выше таблицы будет просто:

EpisodeId
2

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

Ответы [ 3 ]

2 голосов
/ 20 сентября 2019

Если вам нужны эпизоды, но не даты или больницы, то это один из тех редких случаев, когда select distinct можно использовать с group by:

select distinct EpisodeID
from t
group by EpisodeId, DateOfReferral
having count(distinct Hospital) > 1;

Или вы можете сделать это безагрегация:

select distinct EpisodeID
from t
where exists (select 1
              from t t2
              where t2.EpisodeId = t.EpisodeId and
                    t2.DateOfReferral = t.DateOfReferral and
                    t2.Hospital <> t.Hospital
             );

Эта версия, в частности, может использовать индекс на (EpisodeId, DateOfReferral, Hospital), который может сделать его быстрее, чем подход GROUP BY.

2 голосов
/ 20 сентября 2019

Вы можете использовать HAVING с подсчетом, отличным для этого.

Кроме того, вы действительно должны использовать правильные типы данных.Хранение дат в виде строк - плохая идея.https://sqlblog.org/2009/10/12/bad-habits-to-kick-choosing-the-wrong-data-type

declare @Something table
(
    ReferralId int
    , EpisodeId int
    , DateOfReferral varchar(20)
    , Hospital int
)

insert @Something values
(1, 1, '20/04/2019', 1)
, (2, 1, '21/04/2019', 2)
, (3, 2, '28/04/2019', 2)
, (4, 2, '24/04/2019', 3)
, (5, 2, '24/04/2019', 1)
, (6, 3, '22/04/2019', 1)
, (7, 3, '24/04/2019', 4)

select EpisodeID
from @Something s
group by EpisodeId
    , DateOfReferral
having count(distinct Hospital) > 1
1 голос
/ 20 сентября 2019
SELECT EpisodeId FROM table
GROUP BY EpisodeId,DateOfReferral
HAVING COUNT(DISTINCT Hospital)>1

(Я слишком медленно набирал на своем смартфоне - просто заметил, что это то же самое, что и предыдущий ответ, которого не было, когда я начинал.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...