raddevus Ответов: 1

Sql-запрос для возврата сопоставленных результатов на основе двух столбцов


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

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. упорядоченный во времени порядок возрастания

предполагаемые результаты

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

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

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. Это и то, и другое.

Что я уже пробовал:

select connectionid, fileCreated from Table
	group by connectionid, filecreated


Возвращает только 3 строки, но есть 9 строк, так что мой неверен.

1 Ответов

Рейтинг:
7

raddevus

Ладно, кто-то на другом сайте решил эту проблему.
Я абсолютно поражен, потому что ответ, который был предоставлен, дал мне точные результаты, которые я просил. Ух ты!! Это довольно интересный вопрос.

Вот как выглядел ответ на этот вопрос:

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;


Результаты выглядели так:
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


Richard Deeming

Вопрос отправлен 21 час назад; ответ отправлен 21 час назад.

Да ладно тебе! Вы даже не дали нам шанса ответить на этот вопрос. :Д

(Кроме того, в вашем вопросе говорилось, что вам нужна только одна строка на соединение, но этот результат, похоже, имеет несколько строк на соединение.)