Как объединить две таблицы, чтобы переопределить пустые значения и порядок по метке времени? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть две таблицы, которые представляют статус пользователя вместе с отметкой времени, когда его статус изменился.У меня есть что-то вроде этого:

StatusTable

user_id          updated_status   timestamp
---------------- ---------------- -----------------------
1617             PENDING          2018-02-21 01:06:01.000
1617             DONE             2018-02-21 01:01:01.000
1617             PENDING          2018-02-06 01:06:01.000


OverrideStatusTable

user_id          updated_status                   timestamp
---------------- -------------------------------- -----------------------
1617                                              2018-02-23 08:12:40.297
1617             DONE-A                           2018-02-14 15:10:49.717
1617             DONE-B                           2018-02-14 15:10:35.850
1617                                              2018-02-14 15:09:23.973
1617             DONE-A                           2018-02-14 14:59:30.113

Я пытаюсь объединить две таблицы в один результат, упорядоченный по отметке времени, в котором значения в OverriddeStatusTable переопределяют значения в StatusTable, за исключением случаев, когда updated_statusв таблице OverrideStatus пусто, в которой вместо этого отображается самое последнее состояние из StatusTable, но с отметкой времени очищенного значения из OverrideStatusTable.Поэтому я хотел бы, чтобы результат моего запроса выглядел примерно так:

user_id          updated_status   timestamp
---------------- ---------------- -----------------------
1617             PENDING          2018-02-23 08:12:40.297
1617             DONE-A           2018-02-14 15:10:49.717
1617             DONE-B           2018-02-14 15:10:35.850
1617             PENDING          2018-02-14 15:09:23.973
1617             DONE-A           2018-02-14 14:59:30.113
1617             PENDING          2018-02-06 01:06:01.000

Я пытаюсь выяснить, как лучше всего это сделать - имейте в виду, что в конечном итоге я буду загружатьэти две таблицы как DataTables в моем .NET-проекте и запрос их с помощью LINQ.Но сейчас я просто хочу убедиться, что я правильно понял логику.

Прямо сейчас мой запрос настроен так:

select *
from StatusTable
where user_id='1617'
UNION
select *
from OverrideStatusTable
where user_id='1617' and updated_status != ''
order by update_date desc

Но это не приближает меня кчто я хочу.Вывод этого:

user_id          updated_status                   timestamp
---------------- -------------------------------- -----------------------
1617             PENDING                          2018-02-21 01:06:01.000
1617             DONE                             2018-02-21 01:01:01.000
1617             DONE-A                           2018-02-14 15:10:49.717
1617             DONE-B                           2018-02-14 15:10:35.850
1617             DONE-A                           2018-02-14 14:59:30.113
1617             PENDING                          2018-02-06 01:06:01.000

Может кто-нибудь, пожалуйста, помогите мне здесь?Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Ваши результаты могут быть получены с:

select ost.userid, ost.status, ost.timestamp
from OverrideStatusTable ost
where status is not null
union all
select ost.userid,
       (select top 1 st.status
        from statustable st
        where st.user_id = ost.user_id and
              st.timetamp <= ost.timestamp
       ) as status,
       ost.timestamp
from OverrideStatusTable ost
where status is null
union all
select st.*
from statustable st
where timestamp > (select max(ost.timestamp) from OverrideStatusTable ost where ost.userid = st.userid);
0 голосов
/ 31 мая 2018

Полное предположение, если честно, но возможно ...

USE Sandbox;
GO

CREATE TABLE StatusTable (user_id int,
                          updated_status varchar(10),
                          [timestamp] datetime2(3));
GO
CREATE TABLE OverrideStatusTable (user_id int,
                          updated_status varchar(10),
                          [timestamp] datetime2(3));
GO

INSERT INTO StatusTable
VALUES
(1617             ,'PENDING',          '2018-02-21 01:06:01.000'),
(1617             ,'DONE',             '2018-02-21 01:01:01.000'),
(1617             ,'PENDING',          '2018-02-06 01:06:01.000');

INSERT INTO OverrideStatusTable
VALUES
(1617             ,NULL,                               '2018-02-23 08:12:40.297'),
(1617             ,'DONE-A',                           '2018-02-14 15:10:49.717'),
(1617             ,'DONE-B',                           '2018-02-14 15:10:35.850'),
(1617             ,NULL,                               '2018-02-14 15:09:23.973'),
(1617             ,'DONE-A',                           '2018-02-14 14:59:30.113');
GO
SELECT *
FROM (SELECT TOP 1
             user_id,
             updated_status,
             [timestamp]
      FROM StatusTable
      WHERE user_id = 1617
      ORDER BY [Timestamp] ASC) ST
UNION
SELECT user_id,
       ISNULL(updated_status,'PENDING'),
       [timestamp]
FROM OverrideStatusTable OST
WHERE user_id = 1617
ORDER BY [timestamp] DESC;

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