【问题标题】:Get the data repeated n number of times获取重复n次的数据
【发布时间】:2015-07-11 18:51:41
【问题描述】:

以下是我的数据。

ID  Col1    Col2    Col3    Col4
1   101     1000    0      10000
1   102     0       1000   10000

2   101     1000    0      10000
2   102     0       1000   10000

3   103     2000    0      500
3   104     0      250     500

4   101     1000    0      10000
4   102     0      1000    10000
4   103     500     0      10000

我无法获取具有相同数据并出现 2 次的 id。

根据上面的数据,预期的id是1,2。其中参与重复2次。 请帮忙。

【问题讨论】:

  • 为什么你在编辑中划掉了 id #4?它还有一行与 ID #1,2 具有相同的值。

标签: sql sql-server database rdbms


【解决方案1】:

下面的sql试试

select ID from
(
select ID,Col1,Col2,Col3,Col4, count(*) from table
       Group by ID,Col1,Col2,Col3,Col4
       Having count(*) > 1
) as UniqueData

【讨论】:

    【解决方案2】:
    select distinct id
      from tbl x
      join (select col1,
                   col2,
                   col3,
                   col4
              from tbl
             group by col1,
                      col2,
                      col3,
                      col4
            having count(distinct id) > 1) y
        on x.col1 = y.col1
       and x.col2 = y.col2
       and x.col3 = y.col3
       and x.col4 = y.col4
    

    小提琴: http://www.sqlfiddle.com/#!6/8bce9/3/0

    您的 cmets 似乎建议您希望 ID 在所有行上的第 1、2、3 和 4 列中的行都相同,而不仅仅是某些行。但是,如果是这样的话,ID #s 1 和 2 甚至都不匹配。无论如何,如果这真的是你想要的——也许它是,我不知道——这应该这样做。对于上面的示例数据,它不会返回任何结果,因为正如我所说,ID # 1 的第二行与 ID # 2 的第二行不匹配。

    select id
      from tbl t
     where exists (select 1
              from tbl x
             where x.col1 = t.col1
               and x.col2 = t.col2
               and x.col3 = t.col3
               and x.col4 = t.col4
               and x.id <> t.id
               and not exists (select 1
                      from tbl z
                     where z.id = x.id
                       and z.col1 <> x.col1
                        or z.col2 <> x.col2
                        or z.col3 <> x.col3
                        or z.col4 <> x.col4));
    

    【讨论】:

    • 预期 id 的 1 和 2 只是那些只是像镜像
    • ID #4 对于所有列 1、2、3 和 4 具有完全相同的值。为什么这不是“镜像”?
    • 由于 id#4 有其他行,这与 ID 1 和 2 不同,因为第 3 行。所以 id #4 不会出现。如果你看到 id#1 和 #2 那些是像施乐
    • 在逻辑 1 和 2 下甚至不会匹配,因为它们有不匹配的行。它们在一行上共享 col1/2/3/4 中的值,但在另一行上不共享值,因此根据您对“镜像”的定义,它们也不符合该标准。
    【解决方案3】:

    总体思路

    • 为每个 ID 构建一个长字符串,方法是将所有列和该 ID 的行中的所有值连接在一起。
    • 具有相同数据的 ID 将具有相同的串联字符串。
    • 按此字符串分组以查找具有相同数据的那些 ID。

    SQL Fiddle

    WITH
    CTE_Groups
    AS
    (
        SELECT DISTINCT ID
        FROM tbl
    )
    ,CTE_GroupsAggregated
    AS
    (
        SELECT
            CTE_Groups.ID
            ,CA_Data.XML_Value AS DataValues
        FROM
            CTE_Groups
            CROSS APPLY
            (
                SELECT 
                  CAST(Col1 AS varchar(10))+','+
                  CAST(Col2 AS varchar(10))+','+
                  CAST(Col3 AS varchar(10))+','+
                  CAST(Col4 AS varchar(10))+','
                FROM tbl
                WHERE tbl.ID = CTE_Groups.ID
                ORDER BY Col1, Col2, Col3, Col4 FOR XML PATH(''), TYPE
            ) AS CA_XML(XML_Value)
            CROSS APPLY
            (
                SELECT CA_XML.XML_Value.value('.', 'NVARCHAR(MAX)')
            ) AS CA_Data(XML_Value)
    )
    ,CTE_Duplicates
    AS
    (
      SELECT DataValues
      FROM CTE_GroupsAggregated
      GROUP BY DataValues
      HAVING COUNT(*) > 1
    )
    SELECT
      CTE_GroupsAggregated.ID
    FROM
      CTE_GroupsAggregated
      INNER JOIN CTE_Duplicates ON CTE_Duplicates.DataValues = CTE_GroupsAggregated.DataValues
    ;
    

    结果集

    ID
    1
    2
    

    为了更好地理解它的工作原理,将DataValues 包含到输出中并检查每个 CTE 的中间结果。

    【讨论】:

      猜你喜欢
      • 2019-02-23
      • 2019-10-08
      • 2018-08-10
      • 2020-12-14
      • 1970-01-01
      • 2019-05-09
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多