SQL-запрос для выбора первых в серии по столбцу - PullRequest
1 голос
/ 11 июня 2010

У меня возникли проблемы с поиском запроса о том, что я пытаюсь сделать.

У меня есть таблица, которую мы будем называть "Движения" со следующими столбцами:

RecID (Ключ), Элемент (клавиша f), Время (datetime), Комната (int)

Таблица содержит историю Движений для Элементов.Одна запись содержит элемент, для которого эта запись, время записанного местоположения и комнату, в которой она находилась в то время.

Мне бы хотелось, чтобы все записи указывали, что элемент вошел в комнату.Это будет означать первую (по времени) запись для любого элемента в серии движений для этого элемента в той же комнате.

Входные данные - это номер комнаты и время.То есть я хотел бы, чтобы все записи указывали на то, что любой элемент вошел в комнату X после времени Y.

Ближайшее, что я пришел, было это

Select Element, min(Time)
from Movements
where Time > Y and Room = x
group by Element

Это даст мне только одну запись входа в комнатухотя за элемент (если элемент вошел в комнату X дважды с момента Y, я верну только первую) Любые идеи?Дайте мне знать, если я не объяснил это четко.

Я использую MS SQLServer 2005.

1 Ответ

2 голосов
/ 11 июня 2010

Звучит как типичный минимум на группу, а в SQL Server это можно решить с помощью ROW_NUMBER:

SELECT Element, Time
FROM (
    SELECT
        Element, Time, 
        ROW_NUMBER() OVER(PARTITION BY Element ORDER BY Time) AS rn
    FROM Movements
    WHERE Room = 1 AND Time > '2010-06-01 00:30:00'
) T1
WHERE rn = 1

Пример результата:

Element  Time                   
1        2010-06-01 02:00:00.000
2        2010-06-01 03:00:00.000

Данные испытаний:

CREATE TABLE Movements (RecID INT NOT NULL, Element INT NOT NULL, Time DATETIME NOT NULL, Room INT NOT NULL);
INSERT INTO Movements (RecID, Element, Time, Room) VALUES
(1, 1, '2010-06-01 00:00:00', 1),
(2, 1, '2010-06-01 01:00:00', 2),
(3, 1, '2010-06-01 02:00:00', 1),
(4, 2, '2010-06-01 03:00:00', 1),
(5, 2, '2010-06-01 04:00:00', 2),
(6, 1, '2010-06-01 05:00:00', 3),
(7, 2, '2010-06-01 06:00:00', 2);
...