查找相同的行数,但在另一列上不同

时间:2017-11-23 13:31:11

标签: sql postgresql

说我有下表:

Error in plot.xy(xy, type, ...) : invalid plot type

我想识别

  • CREATE TABLE data ( PROJECT_ID VARCHAR, TASK_ID VARCHAR, REF_ID VARCHAR, REF_VALUE VARCHAR ); PROJECT_IDREF_ID是相同的
  • REF_VALUE不同。

所需的输出是此类冲突的TASK_IDTASK_ID_1TASK_ID_2列表。所以,例如,

COUNT(*)

意味着有两个条目DATA +------------+---------+--------+-----------+ | PROJECT_ID | TASK_ID | REF_ID | REF_VALUE | +------------+---------+--------+-----------+ | 1 | 1 | 1 | 1 | | 1 | 1 | 1 | 2 | | 1 | 2 | 1 | 1 | | 1 | 2 | 1 | 2 | +------------+---------+--------+-----------+ OUTPUT +-----------+-----------+----------+ | TASK_ID_1 | TASK_ID_2 | COUNT(*) | +-----------+-----------+----------+ | 1 | 2 | 2 | | 2 | 1 | 2 | +-----------+-----------+----------+ 和两个TASK_ID == 1条目共享其他三个列的相同值。输出中固有的对称性很好。

我如何查找此信息?我已经尝试将表格加入到自身和分组中,但是对于单个任务而言,这比表格中的行完全更多,所以它显然是错误的。

使用的数据库是PostgreSQL,但适用于大多数常见SQL系统的解决方案更可取。

2 个答案:

答案 0 :(得分:1)

您想要自我加入和聚合:

select d1.task_id as task_id_1, d2.task_id as task_id_2, count(*)
from data d1 join
     data d2
     on d1.project_id = d2.project_id and
        d1.ref_id = d2.ref_id and
        d1.ref_value = d2.ref_value and
        d1.task_id <> d2.task_id
group by d1.task_id, d2.task_id;

注意:

  • 如果您希望每对在结果集中只出现一次,请添加条件d1.task_id < d2.task_id
  • 这不会处理NULL值,尽管这很容易处理。使用is not distinct from代替=

您还可以使用using子句简化此操作:

select d1.task_id as task_id_1, d2.task_id as task_id_2, count(*)
from data d1 join
     data d2
     using (project_id, ref_id, ref_value)
where d1.task_id <> d2.task_id
group by d1.task_id, d2.task_id;

您可以使用以下命令了解可能返回的行数:

select d.project_id, d.ref_id, d.ref_value, count(distinct d.task_id), count(*)
from data d
group by d.project_id, d.ref_id, d.ref_value;

答案 1 :(得分:0)

这就是我理解你的问题的方法。这假设同一组合只有两个任务。

<强> SQL DEMO

SELECT "PROJECT_ID", "REF_ID", "REF_VALUE",
       MIN("TASK_ID") as TASK_ID_1,
       MAX("TASK_ID") as TASK_ID_2,
       COUNT(*) as cnt
FROM Table1       
GROUP BY "PROJECT_ID", "REF_ID", "REF_VALUE"
HAVING MIN("TASK_ID") != MAX("TASK_ID") 
    -- COUNT(*) > 1 also should work

输出

我添加了更多列以明确相同的元素:

| PROJECT_ID | REF_ID | REF_VALUE | task_id_1 | task_id_2 | cnt |
|------------|--------|-----------|-----------|-----------|-----|
|          1 |      1 |         2 |         1 |         2 |   2 |
|          1 |      1 |         1 |         1 |         2 |   2 |