SQL: просмотр столбца со значениями из другого столбца - PullRequest
0 голосов
/ 02 января 2019

У меня есть таблица:

Client_ID   Day
------------------
1804    2018-10-22
1804    2018-10-23
1804    2018-10-24
1804    2018-10-25
1804    2018-10-26
1804    2018-10-29
1804    2018-10-30
1804    2018-10-31
1804    2018-11-02
1317    2018-10-24
1317    2018-11-23

Теперь я хочу взять разные значения каждого столбца и (возможно, с помощью оператора while) проверить все значения столбца даты и иметь еще один столбец с утверждением true или false, если этот идентификатор был на эту дату. Поэтому результат должен выглядеть так:

Day       Client_ID Occur
-------------------------
2018.10.22  1804    TRUE
2018.10.23  1804    TRUE
2018.10.24  1804    TRUE
2018.10.25  1804    TRUE
2018.10.26  1804    TRUE
2018.10.29  1804    TRUE
2018.10.30  1804    TRUE
2018.10.31  1804    TRUE
2018.11.02  1804    TRUE
2018.11.23  1804    FALSE
2018.10.22  1317    Does not exist
2018.10.23  1317    Does not exist
2018.10.24  1317    TRUE
2018.10.25  1317    FALSE
2018.10.26  1317    FALSE
2018.10.29  1317    FALSE
2018.10.30  1317    FALSE
2018.10.31  1317    FALSE
2018.11.02  1317    FALSE
2018.11.23  1317    TRUE

Для 1 идентификатора я могу получить результат по этому запросу:

SELECT DISTINCT
    [Day],
    CASE 
       WHEN Client_ID = '1804' 
          THEN 1 
          ELSE 0 
    END AS Occur
FROM 
    table

Но мне нужно, чтобы пройти через все различные значения столбца Day. И если самая низкая дата некоторого идентификатора выше, чем самая низкая дата в столбце «День», то результат должен быть другим. Допустим, «не существует» (но это может быть что угодно). Здесь мне нужна помощь.

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Существует способ сделать циклы while на SQL Server, вы можете попробовать это:

DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <= #Number of loops here)
BEGIN
    #Your statements here
SET @intFlag = @intFlag + 1
END
0 голосов
/ 03 января 2019

Вы можете сгенерировать строки с cross join и использовать left join для ввода значений.Вам нужно еще одно ограничение на самую раннюю дату.Я думаю, я бы сделал:

select d.date, c.client_id,
       (case when d.date < c.min_date then 'Does not exist'
             when t.id is not null then 'TRUE'
             else 'FALSE'
        end) as occur
from (select distinct day from t) d cross join
     (select client_id, min(date) as min_date
      from <table> t
      group by client_id
     ) c left join
     <table> t
     on t.day = d.day and t.client_id = c.client_id;
0 голосов
/ 02 января 2019

Этого можно достичь с помощью CROSS JOIN, который генерирует все возможные комбинации даты и идентификатора в сочетании с LEFT JOIN в исходной таблице, например:

SELECT
    d.date,
    i.id,
    CASE WHEN t.id IS NULL THEN 'FALSE'  ELSE 'TRUE' END
FROM
    (SELECT DISTINCT day FROM table) d
    CROSS JOIN (SELECT DISTINCT id FROM table) i 
    LEFT JOIN table t
        ON t.date = d.date 
        AND t.id = i.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...