【问题标题】:sql get duplicate column values grouped by another columnsql获取由另一列分组的重复列值
【发布时间】:2018-08-09 16:37:36
【问题描述】:

我有以下临时表作为查询的输出:

设施 ID 用户 ID 用户名 1046 105 约翰·史密斯 1046 106 约翰·史密斯 1046 110 杰克·威尔士 1091 107 安娜·罗梅罗 1091 248 丽贝卡克鲁兹 1095 418 亚历克斯·斯特林

我只需要显示具有相同名称用户的这些设施,并且只有这些名称应该通过查询过滤器。这是为了查明是否有任何设施的用户具有完全相同的名称(即使这些用户是不同的人)。因此,考虑到上表,我只需要显示以下内容:

设施 ID 用户 ID 用户名 1046 105 约翰·史密斯 1046 106 约翰·史密斯

【问题讨论】:

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


    【解决方案1】:

    我会使用exists

    select t.*
    from table t
    where exists (select 1 
                  from table t1 
                  where t1.FacilityID = t.FacilityID and 
                        t1.User_Name = t.User_Name and t.userid <> t1.userid
                 );
    

    【讨论】:

    • 感谢它为我工作得很好,得到了所需的结果!
    【解决方案2】:

    你可以使用exists:

    select t.*
    from t
    where exists (select 1
                  from t t2
                  where t2.FacilityID = t.FacilityID and t2.user_name = t.user_name and
                        t2.UserId <> t.userId and
                 );
    

    如果您有查询返回结果,那么窗口函数也是一个不错的选择:

    with t as (<your query here>)
    select t.*
    from (select t.*, min(userid) over (partition by FacilityID, user_name) as min_ui,
                 max(userid) over (partition by FacilityID, user_name) as max_ui
          from t
         ) t
    where min_ui <> max_ui;
    

    【讨论】:

      【解决方案3】:

      我会使用EXISTS 子句:

      (示例使用 CTE [TEMP] 作为测试)

      ;WITH TEMP (FacilityID, UserID, User_Name) AS (
          SELECT * FROM (
              VALUES
                  ('1046','105','John Smith'), 
                  ('1046','106','John Smith'), 
                  ('1046','110','Jack Welsh'), 
                  ('1091','107','Ana Romero'), 
                  ('1091','248','Rebecca Cruz'), 
                  ('1095','418','Alex Sterling')
          ) AS A (Column1, Column2, Column3)
      )
      
      
      SELECT TEMP.*
      FROM TEMP
      WHERE EXISTS (SELECT 1 
          FROM TEMP SubT 
          WHERE SubT.FACILITYID = TEMP.FACILITYID 
              AND SubT.USER_NAME = TEMP.USER_NAME 
              AND TEMP.USERID <> SubT.USERID
          )
      

      【讨论】:

        【解决方案4】:

        我将提出我的解决方案:

        select FacilityID, UserID, User_Name from (
            select FacilityID, UserID, User_Name
                   count(*) over (partition by User_Name) cnt
            from MY_TABLE 
        ) a where cnt > 1
        

        【讨论】:

          猜你喜欢
          • 2015-12-11
          • 2012-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          • 2012-02-14
          • 2016-06-11
          • 1970-01-01
          相关资源
          最近更新 更多