sql - 从 PostgreSQL 的有序日期开始
问题描述
我有一张像
group | date
a | 2002-01-03
a | 2002-01-17
a | 2002-03-18
b | 2001-01-02
我想把它变成一系列跨度,比如
group | start | stop
a | 2002-01-03 | 2002-01-17
a | 2002-01-17 | 2002-03-18
a | 2002-03-18 |
b | 2001-01-02 |
我可以这样做
select distinct on (left.group, left.date)
left.group as group,
left.date as start,
right.date as stop
from dates as left
left join dates as right
on left.group = right.group
and left.date < right.date
order by group, left.date, right.date
但是有没有更好的方法来做到这一点(大连接和排序在真实表上很慢)
解决方案
使用lead()
:
select d.*, lead(d.date) over (partition by d.group order by date)
from dates d
order by group, start;
推荐阅读
- ssh - GitLab SSH 密钥 - 权限被拒绝(公钥)
- angular - 由于 Redux 增强器,Angular e2e 因“找不到 Angular”而失败?
- php - 我正在尝试使用 php 和 mysql OOP 向数据库添加记录
- javascript - 如何将循环/递归与承诺链一起使用?
- php - 阻止在 WooCommerce 中注册的某些域
- css - 如果在下拉菜单中指定 %,为什么动画不再流畅?
- python - 将每个月有一列的文件转换为每月只有一列和一行的文件
- vue.js - 尝试使用 vee-validate 时验证不存在的字段错误
- node.js - 将多节点 API 服务器连接到单实例 Mongodb
- c# - Xamarin 表单状态容器视图不尊重布局选项