我有一个这样的MySQL表:
+----+-----+-------+------+------+-------+---------------------+
| ID | GID | Name | p1 | p10 | p100 | createdAt |
+----+-----+-------+------+------+-------+---------------------+
| 1 | 100 | Item1 | 150 | 1499 | 10245 | 2020-07-04 12:00:00 |
| 2 | 857 | Item2 | 1047 | 9875 | 90000 | 2020-07-04 12:00:10 |
| 3 | 100 | Item1 | 149 | 1495 | 10245 | 2020-07-04 12:15:00 |
| 4 | 857 | Item2 | 1099 | 9875 | 89999 | 2020-07-04 12:15:10 |
| 5 | 100 | Item1 | 149 | 1495 | 10247 | 2020-07-04 12:30:00 |
| 6 | 857 | Item2 | 970 | 9879 | 89998 | 2020-07-04 12:30:10 |
+----+-----+-------+------+------+-------+---------------------+
我尝试为每个唯一的GID
值输出它们的P1,p10,P100
,这些P1,p10,P100
是在创建的两个最近的值
输出示例:
+-----+-------+------+------+-------+---------+----------+-----------+
| GID | Name | p1 | p10 | p100 | p1-last | p10-last | p100-last |
+-----+-------+------+------+-------+---------+----------+-----------+
| 100 | Item1 | 149 | 1495 | 10245 | 149 | 1495 | 10247 |
| 857 | Item2 | 1099 | 9875 | 89999 | 970 | 9879 | 89998 |
+-----+-------+------+------+-------+---------+----------+-----------+
我试图使用子查询来实现我的目标,但我并不满意。
感谢任何能给我提供信息和帮助的人。
共2个答案
匿名用户
您可以使用lag()
:
select gid, name, p1, p10, p100, prev_p1, prev_p10, prev_p100
from (select t.*,
lag(p1) over (partition by gid order by createdAt) as prev_p1,
lag(p10) over (partition by gid order by createdAt) as prev_p10,
lag(p100) over (partition by gid order by createdAt) as prev_p100,
row_number() over (partition by gid order by createdAt desc) as seqnum
from t
) t
where seqnum = 1;
这是一个db<;>小提琴。
子查询返回每个列的前一个值。 外部查询简单地向下筛选每个gid
/name
组合的最新行。
匿名用户
没有窗口函数,这是不容易和不优雅的。
这是一种方法,它涉及自连接,两个级别的聚合和条件聚合:
select t.gid, t.name,
max(case when c.counter = 1 then t.p1 end) p1,
max(case when c.counter = 1 then t.p10 end) p10,
max(case when c.counter = 1 then t.p100 end) p100,
max(case when c.counter = 0 then t.p1 end) p1_last,
max(case when c.counter = 0 then t.p10 end) p10_last,
max(case when c.counter = 0 then t.p100 end) p100_last
from tablename t inner join (
select t1.gid, t1.createdat, count(t2.createdat) counter
from tablename t1 left join tablename t2
on t2.gid = t1.gid and t1.createdat < t2.createdat
group by t1.gid, t1.createdat
having count(t2.createdat) <= 1
) c on c.gid = t.gid and c.createdat = t.createdat
group by t.gid, t.name
请参阅演示。
结果:
| gid | name | p1 | p10 | p100 | p1_last | p10_last | p100_last |
| --- | ----- | ---- | ---- | ----- | ------- | -------- | --------- |
| 100 | Item1 | 149 | 1495 | 10245 | 149 | 1495 | 10247 |
| 857 | Item2 | 1099 | 9875 | 89999 | 970 | 9879 | 89998 |
相关问题
- Android:在模块jefied-play-services-测量和jefied-play-services-测量-impl中发现重复类
- 在Hashmap中查找匹配的键/值对
- 如何迭代Hashmap并与同一Hashmap中的其他键进行组合以比较它们的对象
- HashCode-如果相等的对象碰巧在同一个桶中散列会发生什么?
- 如何防止对数组中类对象的重复引用?
- JavaHashMap内部数据结构在重新散列期间如何变化?
- hashmap如何识别何时需要重新散列
- HashMap基于大小的重新散列
- 如何以及何时在HashMap中完成重新散列
- 散列码的分布如何影响Java的HashMap何时重新散列?
- 在hashmap或hashtable中重新散列的成本
- HashMap如何识别内部数组中的哪些位置包含元素?
- 当HashMap增加其大小时,HashMap中值的索引会发生什么?
- @BeforeClass在ktor测试类中不工作
- Jest vanilla JavaScript JSDOM刷新失败,切换beforeAll到before每一个后的第二次测试中断
- 在笑话中,定义全局变量是否与在BeforeAll中定义相同?
- 静态编程语言中@BeforeAll的正确解决方法是什么
- 线程“main”java. lang.NoClassDefFoundError中的异常:在Intellij[Spring boot]中
- 线程“main”java. lang.NoClassDefFoundError中的异常:org/apache/log4j/ProvisionNode
- 异步管道是否从服务中定义并从组件变量指向的可观察对象取消订阅?