Цикл на результат в SQL Server - PullRequest
0 голосов
/ 10 октября 2018

Пример таблицы

id  emplrcd effdt   country visited
------------------------------------
112233  0   10/9/2018   US
112233  1   10/10/2018  IND
112233  1   10/11/2018  BAN
112233  1   10/12/2018  PAK
112233  0   10/13/2018  US
112233  2   10/14/2018  IND
112233  2   10/16/2018  THA
112233  2   10/17/2018  SIN
112233  0   10/18/2018  US

223344  0   10/9/2018   US
223344  1   10/10/2018  IND
223344  1   10/11/2018  BAN
223344  1   10/12/2018  PAK
223344  0   10/13/2018  US
223344  2   10/14/2018  IND

Я хочу зациклить определенный набор результатов из запроса, например, идентификатор 112233 из США, между двумя кодами стран США, где код страны представляет страну, которую он посетил.

count(*) где страна посетила = США -> 3

Теперь я хочу повторить мой результат 3 раза, получая все промежуточные даты, которые он вышел наружу.Может ли это быть сделано в одном запросе SQL или мне нужно что-то вроде курсора, чтобы сделать это?

Результат для вышеупомянутого курсора или запроса должен вернуть следующие строки

112233  1   10/10/2018  IND
112233  1   10/11/2018  BAN
112233  1   10/12/2018  PAK
112233  2   10/14/2018  IND
112233  2   10/16/2018  THA
112233  2   10/17/2018  SIN

223344  1   10/10/2018  IND
223344  1   10/11/2018  BAN
223344  1   10/12/2018  PAK

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Я бы использовал оконные функции:

select t.*
from (select t.*,
             min(case when t.country = 'US' then t.effdt end) over (partition by t.id) as us_min_effdt,
             max(case when t.country = 'US' then t.effdt end) over (partition by t.id) as us_max_effdt
      from t
     ) t
where country <> 'US' and
      effdt >= us_min_effdt and efft < us_max_effdt;
0 голосов
/ 10 октября 2018

Вот решение, использующее CTE для установки ваших граничных условий.

-------------------------
-- TEST SCHEMA

create table #datatable (id varchar(6), emplrcd int, effdt date, [country visited] varchar (3))

insert into #datatable values

('112233',0,'10/9/2018 ','US '),
('112233',1,'10/10/2018','IND'),
('112233',1,'10/11/2018','BAN'),
('112233',1,'10/12/2018','PAK'),
('112233',0,'10/13/2018','US '),
('112233',2,'10/14/2018','IND'),
('112233',2,'10/16/2018','THA'),
('112233',2,'10/17/2018','SIN'),
('112233',0,'10/18/2018','US '),
('223344',0,'10/9/2018 ','US '),
('223344',1,'10/10/2018','IND'),
('223344',1,'10/11/2018','BAN'),
('223344',1,'10/12/2018','PAK'),
('223344',0,'10/13/2018','US '),
('223344',2,'10/14/2018','IND')

-------------------------
-- QUERY

; WITH boundryDate AS 
(
    SELECT 
        id
         ,min (effdt) mindate
         , max(effdt) maxdate

     FROM
        #datatable
     WHERE
        [country visited] = 'US'
     GROUP BY
        id
)

SELECT
    *
FROM
    #datatable dt

    JOIN boundryDate bd
        on dt.id = bd.id
        and dt.effdt between bd.mindate and bd.maxdate
WHERE
    [country visited] <> 'US'
0 голосов
/ 10 октября 2018

Используйте функцию EXISTS (), чтобы вернуть все строки, которые не являются "US", и где есть EXISTS () строка "US" до, и там EXISTS () строка "US" после.

...