Как получить строку для каждого первого вхождения значения столбца - PullRequest
1 голос
/ 23 сентября 2019

У меня есть таблица с именем lists, имеющая столбцы и строки ниже.


   type     | time | alt_id       
------------+------+---------
 invest_fees| t1   |  5601
 invest_fees| t2   |  5601
 invest_fees| t3   |  5601
 countries  | t4   |  5601
 invest_fees| t5   |  5601
 invest_fees| t6   |  5601
 countries  | t7   |  5601
 countries  | t8   |  5601
 invest_fees| t9   |  5602
 countries  | t10  |  5602

Я хочу получить это:

      type     | time | alt_id       
------------+------+---------
 invest_fees| t1   |  5601
 countries  | t4   |  5601
 invest_fees| t5   |  5601
 countries  | t7   |  5601
 invest_fees| t9   |  5602
 countries  | t10  |  5602

т.е. первое вхождение type каждый разнашлось.Позже я хочу узнать разницу: t4-t1, t7-t5, t10-t9.Любые идеи о том, как я могу добиться этого с помощью SQL?Заранее спасибо.

1 Ответ

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

Для MySQL 8.0+ вы можете использовать LAG():

SELECT t.type, t.time, t.alt_id
FROM (SELECT *, LAG(type) OVER() prev FROM tablename) t
WHERE t.prev IS NULL OR t.prev <> t.type

См. Демонстрационную версию .Для предыдущих версий используйте переменные:

SET @rn := 0;
SET @type := null;
SELECT t.type, t.time, t.alt_id 
FROM (
  SELECT @rn := case 
    WHEN @type = type then @rn + 1 
    ELSE 1
  END AS rn, type, time, alt_id,
  @type := type  
  FROM tablename 
) t
WHERE t.rn = 1

См. demo .Результаты:

| type        | time | alt_id |
| ----------- | ---- | ------ |
| invest_fees | t1   | 5601   |
| countries   | t4   | 5601   |
| invest_fees | t5   | 5601   |
| countries   | t7   | 5601   |
| invest_fees | t9   | 5602   |
| countries   | t10  | 5602   |
...