Distin guish первые строки, в которых значение данного столбца изменяется в сгруппированном результате - PullRequest
1 голос
/ 21 апреля 2020

Я хочу создать запрос на выборку в SQL Сервер, где я группирую строки по столбцу (BaseId), а также упорядочиваю их по Status, RTime и Version. Я хочу добавить столбец «isFirst», который имеет значение 1, если значение BaseId является первым в группе, и 0, если это не так.

Моя пример таблицы:

  Table name: Head
  Id    BaseId    Name       RTime       Status    Version
   2       2      abc     04-12 12:34      1          1
   3       3      xyz     04-12 13:10      9          1
   4       2      abc     04-13 14:25      0          2
   5       3      xyz     04-14 12:34      0          2
   6       3      xyz     04-14 13:10      9          3
   7       3      xyz     04-16 14:25      1          4
   8       2      abc     04-16 17:40      1          3
   9       9      sql     04-17 02:23      9          1
  10       9      sql     04-17 07:31      0          2

Ожидаемый результат:

  isFirst   Id    BaseId    Name       RTime       Status    Version
     1      10       9      sql     04-17 07:31      0          2
     0       9       9      sql     04-17 02:23      9          1
     1       5       3      xyz     04-14 12:34      0          2
     0       7       3      xyz     04-16 14:25      1          4
     0       6       3      xyz     04-14 13:10      9          3
     0       3       3      xyz     04-12 13:10      9          1
     1       4       2      abc     04-13 14:25      0          2
     0       8       2      abc     04-16 17:40      1          3
     0       2       2      abc     04-12 12:34      1          1

Мой запрос теперь выглядит следующим образом:

SELECT *
FROM Head
ORDER BY BaseId desc, Status, RTime desc, Version desc

Я думаю, что я должен использовать CASE для создания столбца isFirst, но мне не повезло, поэтому далеко. Кто-нибудь может мне помочь?

1 Ответ

2 голосов
/ 21 апреля 2020

Вы можете использовать row_number() и выражение case:

select
    case when row_number() over(
            partition by BaseId
            order by Status, RTime desc, Version desc
    ) = 1
        then 1
        else 0
    end isFirst,
    h.*
from head h
order by BaseId desc, Status, RTime desc, Version desc
...