在同一张表中查找差异



我正试图根据特定列在表中找到差异。

我有一张桌子,看起来像这样:

+------------------------+
| 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;

相关内容

  • 没有找到相关文章

最新更新