sql - SQL Informix 高级查询
问题描述
让我试着解释一下我想用我的数据做什么。我的数据结构如下:
我有 3 列:date
、id
和stage
。阶段可以是不同的数字,但我有兴趣展示一些 id 从stage
-1
to的特定转换stage
1
。请看下面的例子。
我有一个
id
instage
-1
,然后过渡到 stage1
,然后又回到 stage-1
。每当从-1
to过渡时1
,我想要那个id
.在这里,我有从
-1
到的过渡3
,这不是我感兴趣的。在这里,进行了过渡,这
id
就是我想要展示的。在这里,我们有从
1
到的过渡-1
,这不是我想要的。
数据:
#1 date id stage
2018-12-31 520000000001354292 -1
2019-09-30 520000000001354292 1
2019-12-31 520000000001354292 -1
#2 2018-12-31 520000000001435675 -1
2019-03-31 520000000001435675 -1
2019-06-30 520000000001435675 3
#3 2018-12-31 520000000003156164 -1
2019-03-31 520000000003156164 -1
2018-12-31 520000000003161014 -1
2019-03-31 520000000003161014 1
#4 2018-12-31 520500000002472437 1
2019-03-31 520500000002472437 -1
2019-06-30 520500000002472437 -1
2019-09-30 520500000002472437 2
我想要的输出是:
520000000001354292
520000000003156164
我希望我解释得足够清楚。
另外,在此之后,我想显示从-1
和1
到 的过渡stage
3
。
解决方案
你可以使用lag()
:
select distinct id
from (
select t.*, lag(stage) over(partition by id order by date) lag_stage
from mytable t
) t
where lag_stage = -1 and stage = 1
这会带来所有id
至少有一个从-1
到过渡的 s 1
。
此外,在此之后,我想展示从 -1 和 1 到第 3 阶段的过渡。
您也可以轻松地调整查询以适应该用例。只需将最后一个where
子句更改为:
where lag_stage in (-1, 1) and stage = 3
推荐阅读
- mysql - 通过不在存储过程mysql中工作来排序
- node.js - bluebird Promise.promisifyAll 可以在 promisify 该对象的功能失败时工作
- php - Yii2 商店产品 id 以逗号分隔
- http - 服务器可以使用 TCP 向客户端发送消息吗?
- java - PL SQL对象类型到java
- android - 有没有办法检测科尔多瓦应用程序是否从后台打开?
- kubernetes - 我们如何在图中可视化 Kubernetes 对象/拓扑?
- elasticsearch - 编写脚本以从 Elasticsearch 中获取不同的值
- azure-ad-b2c - 使用 B2C 生成的密钥签署 IEF 策略令牌
- sql - 在某个字符 SQL 之后动态提取字符串