У меня есть запрос:
SELECT ID, Name, EventTime FROM table
WHERE Name = 'value1' AND EventTime < timeValue1
OR Name = 'value2' AND EventTime < timeValue2
OR Name = 'value3' AND EventTime < timeValue3
...
ORDER BY EventTime DESC
Каждое условие Name = ... AND EventTime < ... может возвращать несколько строк, но мне нужна только строка первый из каждого условия OR в соответствии с пунктом ORDER BY.
Есть ли способ добиться этого или какой-либо обходной путь?
@ZoharPeled основано на EventTime DESC, что означает ссору с Максом EventTime


мне кажется, вы ищете row_number()
select * from ( SELECT ID, Name, EventTime
, row_number() over(partition by Name order by EventTime DESC) rn FROM table
WHERE Name = 'value1' AND EventTime < timeValue1
OR Name = 'value2' AND EventTime < timeValue2
OR Name = 'value3' AND EventTime < timeValue3
...
) a where a.rn=1
Вы можете попробовать:
SELECT Top (1) ID, Name, EventTime FROM table
WHERE Name = 'value1' AND EventTime < timeValue1
OR Name = 'value2' AND EventTime < timeValue2
OR Name = 'value3' AND EventTime < timeValue3
...
ORDER BY EventTime DESC
Пока все ваши имена столбцов одинаковы, вы можете использовать союзы.
SELECT top 1 ID, Name, EventTime FROM table
WHERE Name = 'value1' AND EventTime < timeValue1
ORDER BY EventTime DESC
UNION
SELECT top 1 ID, Name, EventTime FROM table
WHERE
Name = 'value2' AND EventTime < timeValue2
ORDER BY EventTime DESC
UNION
SELECT top 1 ID, Name, EventTime FROM table
WHERE
Name = 'value3' AND EventTime < timeValue3
ORDER BY EventTime DESC
Обновлено: были дополнительные или утверждения, удалили их.
;
WITH A
AS
(
SELECT *, ROW_NUMBER()OVER(PARTITION BY [GROUP] ORDER BY 1) as RN
FROM
(
SELECT ID, Name, EventTime,
CASE WHEN Name = 'value1' AND EventTime < timeValue1 THEN '1'
WHEN Name = 'value2' AND EventTime < timeValue2 THEN '2'
WHEN Name = 'value3' AND EventTime < timeValue3 THEN '3'
WHEN Name = 'value3' AND EventTime < timeValue4 THEN '4'
--Could be more here
END as [Group]
FROM table
)
)
SELECT * FROM A WHERE RN = 1
ORDER BY EventTime DESC
Думаю, я бы подошел к этому так:
SELECT ID, Name, EventTime
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY t.eventtime DESC) as seqnum
FROM table t JOIN
(VALUES ('value1', timevalue1), ('value2', timevalue2), ('value3', timevalue3)
) v(name, timevalue)
ON t.name = v.name and t.eventtime < v.timevalue
) t
WHERE seqnum = 1
ORDER BY EventTime DESC;
Я предпочитаю использовать производную таблицу для таких повторяющихся значений, а не встраивать их в логику запроса.
первая строка на основе какой порядок?