Мне нужно выбрать строки по условию спецификации в части одной таблицы

#sql #sql-server #tsql #sql-order-by

#sql #sql-сервер #tsql #sql-order-by

Вопрос:

У меня проблема с a SELECT в SQL Server. Мне нужно выбрать верхние 3 записи таблицы, и после этого мне нужно найти записи с условием в этих 3 строках. Я написал это, но результат неверен.

 SELECT TOP (3) * 
from data 
where state='c' 
order by time desc
  

Моя таблица (данные) выглядит следующим образом:

 code   data  state   time
 A1     12     n     2020/05/08 12:00
 A2     13     c     2020/05/08 11:59
 A3     10     n     2020/05/08 11:58
 A4     7      c     2020/05/08 11:57
 A5     18     e     2020/05/08 11:56
 A6     14     c     2020/05/08 11:55
  

Мне нужен такой результат:

 A2     13     c     2020/05/08 11:59
  

но результат моего запроса :

  A2     13     c     2020/05/08 11:59
 A4     7      c     2020/05/08 11:57
 A6     14     c     2020/05/08 11:55
  

означает, что мне нужно найти записи по state = ‘c’ в верхних 3 строках, А НЕ в верхних 3 записях таблицы, которые содержат state =’c’

Надеюсь, мое объяснение понятно. Что мне делать?

Ответ №1:

Один из методов — это CTE (общее табличное выражение) для 3 верхних строк, а затем внешний запрос для критериев фильтрации:

 WITH top3 AS (
    SELECT TOP (3) * 
    FROM data 
    ORDER BY time DESC
)
SELECT *
FROM top3
WHERE state='c';
  

Ответ №2:

Попробуйте это:

 SELECT *
FROM
(
    SELECT * 
          ,ROW_NUMBER() OVER (ORDER BY Time DESC) AS [RowID]
    from data 
) DS
WHERE [RowID] <=3
    AND state = 'c'