2013-12-13 1 views
0

Я пытаюсь выяснить, как выполнить запрос на пересылку на сервере 2008r2. Вот основная структура таблицы посещений. Есть и другие поля, но я думаю, что это будет полезно. Одна из проблем заключается в том, что некоторые из них могут быть переносами вместо разрядов, которые у меня нет простого способа вывести, но на этот раз эту проблему можно игнорировать. Я попробовал себя в этом, но, я думаю, мое понимание SQL требует больше работы. Я попытался найти любую информацию, которую я мог бы сделать в Интернете, но ни один из вопросов не привел меня к полезному выводу, или я просто не понял. Мы ценим любые предложения.SQL - Как запросить повторные регистрации в TSQL?

РЕДАКТИРОВАТЬ: Ревитация - если пациент возвращается в течение 30 дней после предыдущей разрядки.

+---------+--------+-----------------+-----------------+ 
| VisitID | UID |  AdmitDT  | DischargeDT | 
+---------+--------+-----------------+-----------------+ 
|  12 | 2  | 6/17/2013 6:51 | 6/17/2013 6:51 | 
|  16 | 3  | 6/19/2013 4:48 | 6/21/2013 13:35 | 
|  18 | 3  | 6/11/2013 12:08 | 6/11/2013 12:08 | 
|  21 | 3  | 6/12/2013 14:40 | 6/12/2013 14:40 | 
|  22 | 3  | 6/13/2013 10:00 | 6/14/2013 12:00 | 
|  25 | 2  | 6/11/2013 16:13 | 6/11/2013 16:13 | 
|  30 | 1  | 6/20/2013 8:35 | 6/20/2013 8:35 | 
|  31 | 7  | 6/13/2013 6:12 | 6/13/2013 6:12 | 
|  34 | 3  | 6/12/2013 8:40 | NULL   | 
|  35 | 1  | 6/12/2013 8:52 | NULL   | 
|  38 | 2  | 6/12/2013 10:10 | 6/12/2013 10:10 | 
+---------+--------+-----------------+-----------------+ 

Попытка Код:

SELECT N2.* 
FROM visitTable AS N1 
INNER JOIN 
visitTable AS N2 ON N1.UID = N2.UID 
WHERE N1.EncounterID <> N2.EncounterID AND (N2.AdmitDT BETWEEN N1.DischargeDT and DATEADD(DD,30, N1.DischargeDT)) 
+0

Как вы определяете повторный прием? – Szymon

+0

@ Шимон повторное признание, если пациент (UID) возвращается в течение 30 дней после их предыдущего посещения. – Dre

ответ

1

Вот начало:

sqlfiddle

new fiddle

Он получает каждое посещение для каждого UID в порядке admitDT, то пары каждое посещение с следующим визитом в этом результате. Если текущая дата вступления в силу находится между последней датой истечения и 30 днями после этого, выберите ее. Тем не менее, есть некоторые странные моменты: UID 1, как показано, был принят 6/12/2012 и никогда не был уволен, но затем снова был принят 6/20/2013 и выписан в тот же день.

редактировать: перестроенный немного сократить число объединений

WITH cte AS (
    SELECT visitid,uid,dischargedt,admitdt, 
    row_number()over(partition BY uid ORDER BY admitdt) AS r 
    FROM t 
) 
SELECT 
c1.visitid AS v1, c2.visitid AS v2, 
c1.uid, 
c1.dischargedt as [Discharged from first visit], 
c2.admitdt as [Admitted to next visit] 
FROM cte c1 
INNER JOIN cte c2 ON c1.uid=c2.uid 
WHERE c1.visitid<>c2.visitid 
AND c1.r+1=c2.r 
AND c2.admitdt BETWEEN c1.dischargedt AND dateadd(d,30,c1.dischargedt) 
ORDER BY c1.uid 

Results:

| V1 | V2 | UID | DISCHARGED FROM FIRST VISIT |  ADMITTED TO NEXT VISIT | 
|----|----|-----|-----------------------------|-----------------------------| 
| 25 | 38 | 2 | June, 11 2013 16:13:00+0000 | June, 12 2013 10:10:00+0000 | 
| 38 | 12 | 2 | June, 12 2013 10:10:00+0000 | June, 17 2013 06:51:00+0000 | 
| 18 | 34 | 3 | June, 11 2013 12:08:00+0000 | June, 12 2013 08:40:00+0000 | 
| 21 | 22 | 3 | June, 12 2013 14:40:00+0000 | June, 13 2013 10:00:00+0000 | 
| 22 | 16 | 3 | June, 14 2013 12:00:00+0000 | June, 19 2013 04:48:00+0000 | 
+0

Это похоже на трюк. Я понятия не имел об использовании ключевого слова WITH. Эта структура сделает многие из моих других более громоздких таблиц со многими объединениями сложных последовательностей гораздо более простыми. Также никогда не слышал о sqlfiddle. Это будет большой ресурс. – Dre

+0

Используя это предложение WITH, вы можете сделать почти все, что вы сделали бы с подзапросом в предложении FROM; Кроме того, предложения WITH (общие табличные выражения) допускают рекурсивные запросы, которых нет в обычных подзапросах. Лично, в большинстве случаев, я считаю, что подзапросы, сгруппированные сверху, легче читать, чем несколько слоев вложенных подзапросов, хотя это всего лишь мнение. – David

+0

Я должен согласиться, одна из самых больших проблем, с которыми я столкнулся, - это вернуться к старым запросам и выяснить, что я раньше делал. Это гораздо легче читать. – Dre

1

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

Select * From visits v 
Where Exists (Select * From Visits 
       Where uid = v.uid 
       and v.AdmitDT > DischargeDT) 
+0

Ничего, я просто готовил сложную функцию привязки к объектам, но это намного лучше. –

1

You не объяснили какие-либо бизнес-правила, поэтому я буду предполагать. Повторный вход - это когда появляется несколько UID, и это каждая запись, кроме первой

Вот еще один метод, использующий функции окон.

SELECT VT.* 
FROM visitTable VT 
INNER JOIN 
(
SELECT VisitID, ROW_NUMBER() OVER (PARTITION BY UID ORDER BY AdmitDT) VisitCount 
FROM visitTable 
) RA 
ON RA.VisitCount > 1 AND RA.VisitID = VT.VisitID 
+0

Извините, что повторный прием - это когда у пациента (UID) есть еще один прием в течение 30 дней. – Dre

+0

Модификация запроса Чарльза даст вам это. –

Смежные вопросы