SQL-запрос для возврата сопоставленных результатов на основе двух столбцов - PullRequest
0 голосов
/ 16 мая 2018

Предположим, у меня есть таблица со следующими столбцами:

Id,   ConnectionId,  File,      FileCreated
int,     int,       varchar,     DateTime

Пример данных

Далее, предположим, что он заполнен несортированными данными, такими как:

    1, 3, "a.dat", 2018-05-16 13:53:40.008
    2, 1, "b.dat", 2018-05-16 13:53:40.007
    3, 3, "c.dat", 2018-05-16 13:53:40.009
    4, 3, "z.dat", 2018-05-16 13:53:40.002
    5, 3, "h.dat", 2018-05-16 13:53:40.003
    6, 2, "ba.dat", 2018-05-16 13:53:40.004
    7, 3, "zy.dat", 2018-05-16 13:53:40.005
    8, 1, "f.dat", 2018-05-16 13:53:40.001
    9, 1, "cd.dat", 2018-05-16 13:53:40.006

Как я могу запросить эти данные, чтобы набор данных возвращал меня:

  1. одна строка для каждого из соединений
  2. заказано в порядке возрастания времени

Ожидаемые результаты

Результат, который я ищу, будет следующим:

( Примечание : я помещаю их в группы, чтобы вы могли видеть, что они возвращаются на основании сначала идентификатора подключения (например, group by)).

8, 1, "f.dat", 2018-05-16 13:53:40.001
4, 3, "z.dat", 2018-05-16 13:53:40.002
6, 2, "ba.dat", 2018-05-16 13:53:40.004

5, 3, "h.dat", 2018-05-16 13:53:40.003
9, 1, "cd.dat", 2018-05-16 13:53:40.006

7, 3, "zy.dat", 2018-05-16 13:53:40.005
2, 1, "b.dat", 2018-05-16 13:53:40.007

1, 3, "a.dat", 2018-05-16 13:53:40.008
3, 3, "c.dat", 2018-05-16 13:53:40.009

Надеюсь, мой пример покажет вам, что они не строго основаны на времени и не строго основаны на connectionId. Это оба.

Ответы [ 2 ]

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

Попробуйте вот так

DECLARE @mockup TABLE(Id INT,ConnectionId INT,[File] VARCHAR(100),FileCreated DATETIME2);
INSERT INTO @mockup VALUES
 (1, 3, 'a.dat','2018-05-16T13:53:40.008')
,(2, 1, 'b.dat','2018-05-16T13:53:40.007')
,(3, 3, 'c.dat','2018-05-16T13:53:40.009')
,(4, 3, 'z.dat','2018-05-16T13:53:40.002')
,(5, 3, 'h.dat','2018-05-16T13:53:40.003')
,(6, 2, 'ba.dat','2018-05-16T13:53:40.004')
,(7, 3, 'zy.dat','2018-05-16T13:53:40.005')
,(8, 1, 'f.dat','2018-05-16T13:53:40.001')
,(9, 1, 'cd.dat','2018-05-16T13:53:40.006');

SELECT *
FROM @mockup
ORDER BY ROW_NUMBER() OVER(PARTITION BY ConnectionId ORDER BY FileCreated)
        ,FileCreated;

Редактирование этого великолепного ответа для добавления результата (и обновления DateTime в DateTime2): Удивительно - результат точно соответствует моим ожидаемым результатам.

Id  ConnectionId    File    FileCreated
8   1              f.dat    2018-05-16 13:53:40.0010000
4   3              z.dat    2018-05-16 13:53:40.0020000
6   2              ba.dat   2018-05-16 13:53:40.0040000
5   3              h.dat    2018-05-16 13:53:40.0030000
9   1              cd.dat   2018-05-16 13:53:40.0060000
7   3              zy.dat   2018-05-16 13:53:40.0050000
2   1              b.dat    2018-05-16 13:53:40.0070000
1   3              a.dat    2018-05-16 13:53:40.0080000
3   3              c.dat    2018-05-16 13:53:40.0090000
0 голосов
/ 16 мая 2018

Вы можете использовать row_number() в предложении order by:

select t.*
from t
order by row_number() over (partition by connectionId order by fileCreated),
         fileCreated;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...