如何在第一次出现列值时获取行

时间:2019-09-23 12:27:11

标签: mysql sql greatest-n-per-group

我有一个名为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 :(得分:0)

对于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

请参见demo
对于以前的版本,请使用变量:

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   |