在同一组中查找和排除对于某些类型具有相同父ID的记录

时间:2013-08-07 17:22:47

标签: sql sql-server sql-server-2008 tsql

我有一张如下表:

GroupID    ParentID    Type

   1         ABC       IND
   1         ABC       IND
   1         CDE       ORD
   1         EFG       STD
   2         ZZZ       IND
   2         ZZZ       IND
   2         ZZZ       IND
   3         YYY       COR
   3         YYY       COR

我需要排除同一组中具有相同父ID且类型为IND或COR的记录。但是我需要保留那些具有不同父ID并且类型不是IND或COR的组。

所以我想得到的结果如下:

GroupID    ParentID    Type

   1         ABC       IND
   1         ABC       IND
   1         CDE       ORD
   1         EFG       STD

不知怎的,我正在考虑使用 Rank () over(partition by GroupID order by ParentID),但它不会给我我想要的结果。

有什么想法? PS:这张表有500万条记录。寻找有效的方法来处理它。

由于

2 个答案:

答案 0 :(得分:1)

以下为您提供了要排除的groupID列表

SELECT GroupID
FROM
(
  SELECT GroupID, 
         COUNT(DISTINCT ParentID) AS PCount, COUNT(DISTINCT TypeCode) as TCount,
         MAX(TypeCode) AS tCode
  FROM tablename
  GROUP BY GroupID
) t
WHERE PCount = 1 AND TCount = 1
   AND (tCode = 'IND' OR tCode = 'COR')

现在选择其他所有内容

SELECT * 
FROM tableName
WHERE GroupID not in (
  SELECT GroupID
  FROM
  (
    SELECT GroupID, 
           COUNT(DISTINCT ParentID) AS PCount, COUNT(DISTINCT TypeCode) as TCount,
           MAX(TypeCode) AS tCode
    FROM tablename
    GROUP BY GroupID
  ) t
  WHERE PCount = 1 AND TCount = 1
    AND (tCode = 'IND' OR tCode = 'COR')
)

用小提琴测试 - > http://sqlfiddle.com/#!3/f1d4f/15/0

答案 1 :(得分:0)

怎么样

 1         ABC       IND

在结果集中?这里的类型是IND,你提到结果集不应该有IND或COR类型吗?