Первая строка для каждого условия «ИЛИ»

У меня есть запрос:

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.

Есть ли способ добиться этого или какой-либо обходной путь?

первая строка на основе какой порядок?

Zohar Peled 27.06.2019 20:39

@ZoharPeled основано на EventTime DESC, что означает ссору с Максом EventTime

Ruslan 27.06.2019 20:48
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
47
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

мне кажется, вы ищете 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;

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

Другие вопросы по теме