sql - SQL GROUP BY 和之后的重新减少
问题描述
我正在使用 PostgreSQL v.11。我有一个有 3 列的表。我的目标是在数据中找到冗余。
首先,我做了一个简单的 GROUP BY:
SELECT client, block, "date"
FROM lines
GROUP BY client, block, "date"
ORDER BY client, block
结果如下所示:
1 | P10001 | 2020-01-01
1 | P10002 | 2020-04-17
1 | P10002 | 2020-05-04
1 | P10003 | 2020-05-05
现在我想识别具有相同“块”但不同“日期”的行。在本例中,第 2 行和第 3 行就是这种情况(块 = P10002)
现在,我使用 javascript 来解析完整的结果集并找到这 2 个冗余行(我使用result.reduce(...)
)
但是有没有办法在纯 SQL 中提取这个“减少”的结果?
预期的结果是这样的:
1 | P10002 | 2020-04-17
1 | P10002 | 2020-05-04
将两个日期保留在结果集中应该很好,因为我只需要更改其中一个的“块”。如果结果集中没有日期列,则需要执行第二次请求以查找所有受影响的行。
这是表和数据的脚本
CREATE TABLE lines (
"client" integer NOT NULL,
"block" text NOT NULL,
"date" date NOT NULL
);
INSERT INTO lines ("client", "block", "date") VALUES
(1, 'P10001', '2020-01-01'),
(1, 'P10002', '2020-04-17'),
(1, 'P10002', '2020-05-04'),
(1, 'P10003', '2020-05-05');
非常感谢
解决方案
您可以将HAVING
子句与GROUP
ing一起使用,BY block
以明确计算dates
:
SELECT block
FROM lines
GROUP BY block
HAVING COUNT( DISTINCT "date" ) > 1;
block
------
P10002
推荐阅读
- java - 数据库中的外键始终为空
- python - 我正在尝试使用 Tweepy 和 Python 制作 Twitter 机器人,但出现错误 215?
- c++ - 如果类在堆上,函数会进入堆还是堆栈?
- go - 从 github 问题中检索最新评论
- java - Spring Boot 对象字段属性中的验证顺序
- bash - ffmpeg:在while循环中执行命令
- java - 如何使用 ActiveMQ 消费来自虚拟主题的消息?
- typescript - Vuex商店更新未在组件中应用重新渲染
- react-native - 如何在抽屉导航屏幕中传递参数?
- nginx - 有关 Nginx 如何在 Google 计算引擎上使用 SSL 的详细信息