Как получить максимальное значение в следующем случае (SQL Server) - PullRequest
0 голосов
/ 23 октября 2019

У меня есть таблица, как показано ниже

ID      Code
1       A001
2       A001
3       A001
4       A002
5       A001
6       A002

Я хочу получить ID max, где код = A001 (но идентификатор должен быть 3, потому что если ID = 4, код = A002)

естьдругой пример

ID      Code
1       A001
2       A002
3       A001
4       A002
5       A001
6       A002

результат должен быть ID = 1

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Если я правильно понимаю, вам нужен «последний» ряд начальной последовательности. Исходя из вашего вопроса:

select t.*
from t
where t.id < (select min(t2.id)
              from t t2
              where t2.code <> 'A001'  -- not NOT EQUALS
             ) 
order by t1.id desc;

Представляется более разумным, что 'A001' не будет жестко закодирован, а будет рассчитываться как «первое» значение.

В этом случае:

select t.*
from t cross join
     (select top (1) t.*
      from t
      order by t.id
     ) top1
where t.id < (select min(t2.id)
              from t t2
              where t2.code <> top1.id  -- not NOT EQUALS
             ) 
order by t1.id desc;

Необходимо настроить, если все коды одинаковы. Но в ваших примерах данных у вас есть несколько значений.

С помощью оконных функций вы можете выразить это как:

select top (1) t.*
from (select t.*,
             min(case when code <> first_code then id end) over () as first_notcode_id
      from (select t.*,
                   first_value(code) over (order by id) as first_code
            from t
           ) t
     ) t
where first_notcode_id is null or
      id < first_notcode_id
order by id;
0 голосов
/ 23 октября 2019

Если ваша СУБД поддерживает оконную функцию, вот 1 способ достижения желаемого результата

SELECT MAX(ID), CODE
FROM (SELECT D.ID, D.CODE, D.ID - ROW_NUMBER() OVER(PARTITION BY D.CODE ORDER BY D.ID) RN
      FROM DATA_TABLE D
      WHERE CODE = 'A001') X
WHERE RN = 0
GROUP BY CODE

Здесь - это скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...