我有一个名为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实现此目标的任何想法?
预先感谢。
答案 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 |