Я испытываю некоторые затруднения, придумывающие запрос для того, что я пытаюсь сделать.
У меня есть таблица, которую мы назовем 'Перемещениями' со следующими столбцами:
RecID (ключ), элемент (f-ключ), время (дата и время), комната (интервал)
Таблица содержит историю Перемещений за Элементы. Одна запись содержит элемент, который запись для, время зарегистрированного местоположения и комнаты, в которой это было в то время.
Что я хотел бы, все записи, которые указывают, что Элемент ввел комнату. Это означало бы первое (ко времени) запись для любого элемента в ряду перемещений за тот элемент в той же комнате.
Вход является номером комнаты и время. IE, я хотел бы все записи, указывающие, что любой Элемент ввел комнату X после времени Y.
Самое близкое я приехал, было этим
Select Element, min(Time)
from Movements
where Time > Y and Room = x
group by Element
Это только даст мне одну запись записи помещения на Элемент хотя (Если Элемент ввел комнату X дважды со времени Y, я только верну первый), Какие-либо идеи? Сообщите мне, не объяснил ли я это ясно.
Я использую MS SQLServer 2005.
Звучит как типичный минус для группы, и в 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);