ВЫБЕРИТЕ из 50 столбцов - PullRequest
1 голос
/ 13 мая 2019

У меня есть таблица, в которой много столбцов, около 50 столбцов, которые содержат данные даты и времени, представляющие шаги, которые пользователь выполняет, когда выполняет процедуру

SELECT UserID, Intro_Req_DateTime, Intro_Onset_DateTime, Intro_Comp_DateTime, Info_Req_DateTime, Info_Onset_DateTime, Info_Comp_DateTime, 
Start_Req_DateTime, Start_Onset_DateTime, Start_Comp_DateTime,
Check_Req_DateTime, Check_Onset_DateTime, Check_Comp_DateTime,
Validate_Req_DateTime, Validate_Onset_DateTime, Validate_Comp_DateTime,
....
FROM MyTable

Я хочу найти шаг, который сделал пользователь после определенной даты

пример Я хочу найти пользователя ABC, какой первый шаг он сделал после 2 мая 2019 г. 17: 25: 36

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

Есть ли более простой способ сделать это?

P.S. Спасибо всем, кто предложил изменить структуру базы данных. Не все базы данных могут быть изменены, эта база данных предназначена для одной из наших больших систем и используется более 20 лет. перепроектирование вне уравнения.

Ответы [ 2 ]

3 голосов
/ 13 мая 2019

Вы можете использовать CROSS APPLY, чтобы отключить значения. Синтаксис UNPIVOT довольно громоздкий.

Фактический текст запроса должен быть достаточно управляемым. Нет необходимости в сложных CASE заявлениях. Да, вам придется явно перечислить все 50 имен столбцов в тексте запроса, вы не можете избежать этого, но это будет только один раз.

SELECT TOP(1)
    A.StepName
    ,A.dt
FROM
    MyTable
    CROSS APPLY
    (
        VALUES
         ('Intro_Req', Intro_Req_DateTime)
        ,('Intro_Onset', Intro_Onset_DateTime)
        ,('Intro_Comp', Intro_Comp_DateTime)
        .........
    ) AS A (StepName, dt)
WHERE
    MyTable.UserID = 'ABC'
    AND A.dt > '2019-05-02T17:25:36'
ORDER BY dt DESC;

См. Также Как отключить столбцы с помощью CROSS APPLY в SQL Server 2012

1 голос
/ 13 мая 2019

Лучший способ - создать таблицу с типом действия и датой, когда это действие было выполнено. Затем вы можете использовать простое предложение where, чтобы найти то, что вы хотите. Таблица должна быть похожа на таблицу ниже:

ID          ActionType  ActionDatetime      
----------- ----------- ------------------- 
1492        1           2019-05-13 10:10:10          
1494        2           2019-05-13 11:10:10 
1496        3           2019-05-13 12:10:10 
1498        4           2019-05-13 13:10:10 
1500        5           2019-05-13 14:10:10 

Но в вашем текущем решении вы должны использовать UNPIVOT, чтобы получить то, что вы хотите. Вы можете найти больше информации в этом ССЫЛКА .

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