SQL-запрос для выбора первых в ряду столбцом

Я испытываю некоторые затруднения, придумывающие запрос для того, что я пытаюсь сделать.

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

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.

1
задан Mark Byers 11 June 2010 в 19:13
поделиться

1 ответ

Звучит как типичный минус для группы, и в 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);
2
ответ дан 2 September 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: