首页 > 解决方案 > 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');

非常感谢

标签: sqlpostgresqlgroup-byreduce

解决方案


您可以将HAVING子句与GROUPing一起使用,BY block以明确计算dates

SELECT block
  FROM lines
 GROUP BY block
HAVING COUNT( DISTINCT "date" ) > 1;


block
------
P10002

推荐阅读