Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 T-SQL: Как закрыть все полисы и оставить действующим только последний по дате создания?  [new]
d.mityaev
Member

Откуда: Замкадье
Сообщений: 20
Есть таблица MED_POLICES

Поля:

MED_POLIS_ID - айди мед. полиса
PATIENTS_ID - айди пациента
NOMER_POLISA - номер полиса
DEYSTVUYUSCHIY (0, 1) - признак действующий ли полис
IS_MAIN (0, 1) - признак является ли полис основным. По хорошему, должен стоять только у одного из всех полисов пациента, но встречаются и косяки
CREATE_DATE_TIME - дата, время создания полиса
OPEN_DATE - дата открытия полиса
CLOSE_DATE - дата закрытия

У многих пациентов есть по несколько полисов.

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

Хочу сначала поменять статус ВСЕХ полисов на неактивный и убрать с них все признак "основной" (будет DEYSTVUYUSCHIY = 0, IS_MAIN = 0),
а затем у каждого пациента сделать последний по дате создания полис активным и основным (DEYSTVUYUSCHIY = 0, IS_MAIN = 0)

Как это можно сделать?
19 июл 17, 11:34    [20656849]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL: Как закрыть все полисы и оставить действующим только последний по дате создания?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
d.mityaev,

пронумеровываете типа ROW_NUMBER() OVER(PARTITION BY пациент ORDER BY дата полиса) и update всех у кого номер <> 1
19 июл 17, 11:44    [20656905]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL: Как закрыть все полисы и оставить действующим только последний по дате создания?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ORDER BY дата полиса DESC есессно
19 июл 17, 11:49    [20656935]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL: Как закрыть все полисы и оставить действующим только последний по дате создания?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
WITH CTE AS(N=ROW_NUMBER()OVER(PARTITION BY PATIENTS_ID ORDER BY CREATE_DATE_TIME DESC),* FROM  MED_POLICES)
UPDATE CTE SET
 DEYSTVUYUSCHIY=CASE N WHEN 1 THEN 1 ELSE 0 END
,IS_MAIN=CASE N WHEN 1 THEN 1 ELSE 0 END
WHERE DEYSTVUYUSCHIY<>CASE N WHEN 1 THEN 1 ELSE 0 END OR IS_MAIN<>CASE N WHEN 1 THEN 1 ELSE 0 END;

?
19 июл 17, 16:06    [20658259]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL: Как закрыть все полисы и оставить действующим только последний по дате создания?  [new]
d.mityaev
Member

Откуда: Замкадье
Сообщений: 20
iap, c CTE идея, конечно, но выдает ошибку: "Incorrect syntax near 'N'.
"

Что там может быть не так?
25 июл 17, 09:19    [20671841]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL: Как закрыть все полисы и оставить действующим только последний по дате создания?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
d.mityaev,

ну SELECT человек пропустил, допишите
25 июл 17, 09:35    [20671911]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL: Как закрыть все полисы и оставить действующим только последний по дате создания?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
d.mityaev
iap, c CTE идея, конечно, но выдает ошибку: "Incorrect syntax near 'N'.
"

Что там может быть не так?
WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY PATIENTS_ID ORDER BY CREATE_DATE_TIME DESC),* FROM  MED_POLICES)
UPDATE CTE SET
 DEYSTVUYUSCHIY=CASE N WHEN 1 THEN 1 ELSE 0 END
,IS_MAIN=CASE N WHEN 1 THEN 1 ELSE 0 END
WHERE DEYSTVUYUSCHIY<>CASE N WHEN 1 THEN 1 ELSE 0 END OR IS_MAIN<>CASE N WHEN 1 THEN 1 ELSE 0 END;


Сообщение было отредактировано: 25 июл 17, 10:35
25 июл 17, 10:22    [20672099]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить