Как узнать, является ли элемент первым в столбце в SQLite? - PullRequest
0 голосов
/ 11 октября 2019

Если у меня есть стол:

Person:  Action:   Location:
-------  --------  ---------
Alan     Pondered  Garden
Bob      Hesitated Stairs 
Carol    ACTED     Kitchen
Dave     ACTED     Kitchen
Eric     Slept     Kitchen
Alan     ACTED     Cellar
Bob      Slept     Cellar
Fred     ACTED     Cellar

.. и я хочу найти первого человека, который «ДЕЙСТВУЛ» первый в каждой комнате, как это сделать? Я делаю это?

Я хотел бы сделать это в рамках существующего запроса:

SELECT Person,
       Location,
       <CLEVER-CODE-HERE> as flg_First --BOOLEAN was first to ACT
FROM my_table
GROUP BY Person,Location
ORDER BY Person

Желаемый результат будет:

Person: Location: flg_First:
------- --------- ----------
Alan    Cellar    TRUE
Alan    Garden    False
Bob     Cellar    False
Bob     Stairs    False
Carol   Kitchen   TRUE
Dave    Kitchen   False
Eric    Bedroom   False
Fred    Cellar    False

Я надеюсь, что этовозможно достижимо (с оконной функцией?), но как?

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Позвольте мне предположить, что у вас есть столбец порядка, например rowid, который определяет порядок строк.

Если это так, один метод использует row_number() с некоторой условной логикой:

select t.*,
       (case when action <> 'ACTED' then 'false'
             when 1 = row_number() over (partition by location, action order by rowid)
             then 'true' 
             else 'false'
        end) as flag
from t;
1 голос
/ 11 октября 2019

С НЕ СУЩЕСТВУЮЩИМ:

select m.person, m.location,
  case 
    when m.action = 'ACTED' and not exists (
      select 1 from my_table
      where action = m.action and location = m.location and rowid < m.rowid
    ) then 'TRUE'
    else 'False'
  end flg_First 
from my_table m
order by m.person, m.location

См. Демоверсию . Вы можете сделать это также с помощью ROW_NUMBER() с составной сортировкой, включающей action и rowid:

select person, location,
  case 
    when action = 'ACTED' 
      and row_number() over (partition by location order by action <> 'ACTED', rowid) = 1 then 'TRUE'
    else 'False'
  end flg_First
from my_table
order by person, location

См. Демонстрационную версию . Результаты:

| Person | Location | flg_First |
| ------ | -------- | --------- |
| Alan   | Cellar   | TRUE      |
| Alan   | Garden   | False     |
| Bob    | Cellar   | False     |
| Bob    | Stairs   | False     |
| Carol  | Kitchen  | TRUE      |
| Dave   | Kitchen  | False     |
| Eric   | Kitchen  | False     |
| Fred   | Cellar   | False     |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...