sql - PostgreSQL分区并选择具有特定列值的第一行
问题描述
我有以下格式的数据:
ID DATE METRIC
1 1/1/19 1
1 1/3/19 1
1 1/5/19 0
2 1/2/19 0
2 1/9/19 0
2 1/11/19 0
3 1/1/19 0
3 1/2/19 0
3 1/3/19 1
我想要完成的是每个 ID 只取一行,如果有 1 个指标,则第一个日期为 1。如果没有 1 个指标,则取该行并将日期设为 NULL。我想要的输出如下所示:
ID DATE METRIC
1 1/1/19 1
2 NULL 0
3 1/3/19 1
我最接近的是做一个row_number() OVER (PARTITION BY ID order by DATE) as RN
然而,这只是让我每个 ID 都有编号的行。在分区内时可以做一个案例吗?
解决方案
您可以使用DISTINCT ON
条件逻辑:
select distinct on(t.id)
t.id,
case when t.metric = 1 then t.date end date,
metric
from mytable t
order by t.id, t.metric desc, t.date
编号 | 日期 | 公制 -: | :--------- | -----: 1 | 2019-01-01 | 1 2 | 空 | 0 3 | 2019-03-01 | 1
推荐阅读
- python - 如何在保留引号的同时将带有字符串的列表设置为 yaml 值?
- javascript - 如何在 D3 中查找过滤子集中的项目数
- android - 在活动中创建片段实例并重用它是不好的编码习惯吗?
- javascript - ReactJS:来自 Express 的数据显示为数字而不是 JSON
- c++ - 标准差公式
- python - 安装 Tensorflow 时遇到问题 - 为 wrapt 构建轮子(setup.py)...错误
- python - django-admin.py startproject mysite 不工作
- intellij-idea - IdeaVim:从命令更改为插入模式并返回等时,有没有办法更改背景颜色?例如每种模式都有自己的背景颜色
- java - 由于只读消息和 Mac 上的灰色编辑器,我无法在 NetBeans 中编辑文件
- swift - 如何在 SwiftUI 中删除主要内容视图和标签栏之间的间距?