sql select records having count > 1 where at lease one record has value

后端 未结 5 1932
情深已故
情深已故 2021-02-13 18:20

I\'m trying to get all participants that have more than 1 record in the table where at lease one of those records has IsCurrent = 0 and IsActive = 1

This is what I have

相关标签:
5条回答
  • 2021-02-13 18:42
    select 
      ParticipantId
    from Contact as c
    group by
      ParticipantId
    having 
      Count(*) > 1
      and
      Sum(Case when IsCurrent = 0 then 1 else 0 end) >= 1
      and
      Sum(Case when IsActive = 1 then 1 else 0 end) >= 1
    

    I would first try this

    0 讨论(0)
  • 2021-02-13 18:45

    Use it as a subquery and join to it:

    select * from 
    (
        SELECT  ParticipantId 
        FROM Contact
        WHERE (IsCurrent = 0 AND IsActive = 1 AND ContactTypeId = 1)
        Group by ParticipantId
        Having COUNT(ParticipantId) > 1
    ) base
    inner join Contact c on c.ParticipantId = base.ParticipantID
    WHERE (IsCurrent = 0 AND IsActive = 1 AND ContactTypeId = 1)
    
    0 讨论(0)
  • 2021-02-13 18:47
      SELECT  ParticipantId 
        FROM Contact
       Group by ParticipantId 
      Having Count(*) > 1 
    Intersect
      SELECT  ParticipantId 
        FROM Contact
       WHERE IsCurrent = 0 
         AND IsActive = 1 
         AND ContactTypeId = 1
    
    0 讨论(0)
  • 2021-02-13 18:59

    I think you should just remove:

    AND ContactTypeId = 1
    

    which seems to be an idexed column

    0 讨论(0)
  • 2021-02-13 19:03

    You can use EXISTS:

    SELECT  ParticipantId 
    FROM    Contact
    WHERE   EXISTS
            (   SELECT  1
                FROM    Contact c2
                WHERE   c2.ParticipantID = c.ParticipantId
                AND     ContactTypeId = 1
                GROUP BY ParticipantID
                HAVING COUNT(*) > 1
                AND COUNT(CASE WHEN IsCurrent = 0 AND IsActive = 1 THEN 1 END) >= 1
            );
    
    0 讨论(0)
提交回复
热议问题