如何获取每日最高value对应行的id、timestamp及value字段?
数据
| id | timestamp | value |
|---|---|---|
| 225 | 2018-07-24 13:00:00 | 0 |
| 226 | 2018-07-24 18:33:32 | 196 |
| 227 | 2018-07-25 5:59:14 | 290 |
| 173 | 2018-07-05 8:16:14 | 258 |
| 228 | 2018-07-25 7:00:00 | 469 |
| 175 | 2018-07-07 6:00:00 | 0 |
| 176 | 2018-07-07 9:25:35 | 236 |
| 177 | 2018-07-07 17:19:13 | 300 |
| 178 | 2018-07-08 5:47:13 | 323 |
| 179 | 2018-07-08 6:49:14 | 230 |
| 180 | 2018-07-08 17:45:36 | 270 |
| 181 | 2018-07-09 5:41:13 | 250 |
| 182 | 2018-07-09 9:43:13 | 213 |
| 183 | 2018-07-09 18:37:44 | 226 |
| 184 | 2018-07-10 5:22:44 | 380 |
| 185 | 2018-07-10 7:37:14 | 200 |
| 186 | 2018-07-10 15:54:44 | 260 |
预期结果
| id | timestamp | value |
|---|---|---|
| 226 | 2018-07-24 18:33:32 | 196 |
| 173 | 2018-07-05 8:16:14 | 258 |
| 228 | 2018-07-25 7:00:00 | 469 |
| 177 | 2018-07-07 17:19:13 | 300 |
| 178 | 2018-07-08 5:47:13 | 323 |
| 181 | 2018-07-09 5:41:13 | 250 |
| 184 | 2018-07-10 5:22:44 | 380 |
修改后的查询方案
方法一:窗口函数(推荐)
用ROW_NUMBER()窗口函数按日期分组,每组内按value降序排序,取排序第一的行:
SELECT id, timestamp, value FROM ( SELECT id, timestamp, value, ROW_NUMBER() OVER (PARTITION BY timestamp::date ORDER BY value DESC) AS rn FROM yourtable ) t WHERE rn = 1 ORDER BY timestamp::date;
如果同一天存在多行value同为最大值的情况,想保留所有这些行,可以把ROW_NUMBER()换成RANK()。
方法二:子查询关联
先通过子查询算出每日最大value,再关联主表匹配日期和value:
SELECT t.id, t.timestamp, t.value FROM yourtable t JOIN ( SELECT timestamp::date AS day, MAX(value) AS max_value FROM yourtable GROUP BY day ) m ON t.timestamp::date = m.day AND t.value = m.max_value ORDER BY m.day;
内容的提问来源于stack exchange,提问作者montes
相关产品推荐
相关产品推荐

