Как выбрать самую последнюю дату для каждой группы по номеру?

Я застрял в этом вопросе некоторое время, и мне было интересно, сможет ли сообщество направить меня в правильном направлении?

У меня есть несколько идентификаторов тегов, которые необходимо сгруппировать, с исключениями (столбец: удален), которые необходимо сохранить в результатах. После чего для каждого сгруппированного идентификатора тега мне нужно выбрать один с самой поздней датой. Как я могу это сделать? Пример ниже:

ID  |  TAG_ID  |  DATE     |  DELETED 
1   |  300     |  05/01/20 |  null
2   |  300     |  03/01/20 |  04/01/20
3   |  400     |  06/01/20 |  null
4   |  400     |  05/01/20 |  null
5   |  400     |  04/01/20 |  null
6   |  500     |  03/01/20 |  null
7   |  500     |  02/01/20 |  null

Я пытаюсь достичь этого результата:

ID  |  TAG_ID  |  DATE     |  DELETED 
1   |  300     |  05/01/20 |  null
2   |  300     |  03/01/20 |  04/01/20
3   |  400     |  06/01/20 |  null
6   |  500     |  03/01/20 |  null

Итак, во-первых, если в столбце «УДАЛЕНО» есть дата, я бы хотел, чтобы присутствовала строка. Во-вторых, для каждого уникального идентификатора тега я бы хотел, чтобы присутствовала строка с самой последней «ДАТА».

Надеюсь, этот вопрос понятен. Буду признателен за ваши отзывы и помощь! Большое спасибо заранее.

Всего 2 ответа


Ваши результаты выглядят примерно так:

select t.*
from (select t.*,
             row_number() over (partition by tag_id, deleted order by date desc) as seqnum
      from t
     ) t
where seqnum = 1 or deleted is not null;

Это занимает одну строку, где deleted is null - самая последняя строка. Кроме того, каждая строка, где deleted is not null .


Вам нужно 2 условия в сочетании с OR в WHERE :
1-й deleted is not null , или
2-й, что нет другой строки с таким же tag_id и date более поздней, чем date текущей строки, что означает, что date текущей строки является самой последней:

select t.* from tablename t
where t.deleted is not null
or not exists (
  select 1 from tablename
  where tag_id = t.tag_id and date > t.date
) 

Смотрите демо .
Результаты:

| id  | tag_id | date       | deleted  |
| --- | ------ | ---------- | -------- |
| 1   | 300    | 2020-05-01 |          |
| 2   | 300    | 2020-03-01 | 04/01/20 |
| 3   | 400    | 2020-06-01 |          |
| 6   | 500    | 2020-03-01 |          |

Есть идеи?

10000