我正试图根据特定列在表中找到差异。
我有一张桌子,看起来像这样:
+------------------------+
| rn | P_id | D_id |
+------------------------+
| 1 | 8 | 20 |
+----+--------------+----+
| 2 | 13 | 20 |
+----+--------------+----+
| 3 | 8 | 21 |
+----+--------------+----+
| 4 | 13 | 21 |
+----+--------------+----+
| 5 | 15 | 21 |
+----+--------------+----+
| 6 | 17 | 21 |
+------------------------+
因此,我想得到D_id等于21并且是唯一的行的p_id_id其中D_id等于20(
例如,在所示的表中,预期结果将是-p_id15和17。
如果可能的话,希望使用JOIN获得此结果。
编辑:我正在使用MSSQL。我想解释一下情况,只是为了澄清一些困惑。假设D_id代表downloadID(21-最新下载,20-旧下载(,所以我想简单地比较旧下载和新下载的数据,看看是否添加了任何新数据。在这种情况下,这些新记录是P_id为15和17的记录
WITH CTE(RN,P_ID,D_ID) AS
(
SELECT 1 , 8 , 20 UNION ALL
SELECT 2 , 13 , 20 UNION ALL
SELECT 3 , 8 , 21 UNION ALL
SELECT 4 , 13 , 21 UNION ALL
SELECT 5 ,15 , 21 UNION ALL
SELECT 6 , 17, 21
)
SELECT C.P_ID
FROM CTE AS C
GROUP BY C.P_ID
HAVING MAX(C.D_ID)=MIN(C.D_ID) AND MAX(C.D_ID)=21
如果必须使用联接,则应使用一个子查询,在该子查询中获取p_id的出现次数。
此查询获取发生次数:
SELECT `P_id`, COUNT(`rn`) AS `cnt`
FROM `table`
GROUP BY `P_id`;
这意味着整个查询变成这样:
SELECT t.`P_id`
FROM `table` t
INNER JOIN ( SELECT `P_id`, COUNT(`rn`) AS `cnt`
FROM `table`
GROUP BY `P_id` ) c
ON c.`P_id` = t.`P_id`
WHERE t.`D_id` = 21 AND c.`cnt` = 1;