说我有下表:
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_ID
,REF_ID
是相同的REF_VALUE
不同。所需的输出是此类冲突的TASK_ID
,TASK_ID_1
和TASK_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系统的解决方案更可取。
答案 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 |