【问题标题】:Retrieving distinct values and a count on duplicates in SQL检索不同的值并计算 SQL 中的重复项
【发布时间】:2017-09-13 12:43:44
【问题描述】:

我们有一个表,我们称之为“源表”,我从那里检索这些列,如下所示;

ANr, TNr, Type, IDate, EDate
1132173, 113615, Bogus, 2017-09-11 13:01:00, 2017-09-13 14:10:00
1132145, 184210, Triss, 2017-09-11 13:05:00, 2017-09-13 14:10:00
1131828, 259858, Bogus, 2017-09-11 13:11:00, 2017-09-13 14:10:00
1131844, 259858, Bogus, 2017-09-11 13:11:00, 2017-09-13 14:10:00

上述结果将转到一个名为“export-table”的新表,然后我想从第三个表“info-table”中进行选择,但仅限于那些刚刚插入“export-table”的表,并且a 计算有多少重复条目(如果有的话)(除了 Anr 总是唯一的)

通过上面提到的选择,我想要以下结果:

Customernr, ANr, IDate, Type, Amount
703524, 1132173,2017-09-11 13:01:00, Bogus, 1
756899, 1132145,2017-09-11 13:05:00, Triss, 1
356658, 1131828,2017-09-11 13:11:00, Bogus, 2

Customernr 来自“info-table”,其中 ANr 作为唯一键。

正如您所见,“source-table”的最后两行除了 Anr 之外是相同的,但我需要 Anr 稍后才能从“info-table”中获取正确的值。如果我可以同时使用 Tnr 和 IDate 搜索“信息表”,它可能在没有 Anr 的情况下工作,但我也会在那里得到重复的条目,所以不确定这是否有帮助。

如果有人想知道为什么是“导出表”,那么它是一种故障安全,所以我不会多次导出相同的东西。

我一直在搜索,但由于这是一个有点复杂的问题,我还没有找到完整的解决方案或任何好的提示。

【问题讨论】:

  • 您希望 Customernr 在结果中,但我在您的示例数据中找不到该信息。
  • Customernr 来自我在示例中没有指定的“信息表”。我应该补充一点,如果它可以用另一种方式解决,那么在“导出表”中只使用 Anr 和 EDate 就足够了。

标签: sql sql-server tsql select sql-server-2014


【解决方案1】:

你怎么不放客户,我能帮你的最好的就是

DECLARE @t table 
(
    ANr int
    ,TNr int 
    , Type varchar(10) 
    , IDate datetime 
    , EDate Datetime
)

insert @t (ANr, TNr, Type, IDate, EDate) values 
(1132173, 113615, 'Bogus', '2017-09-11 13:01:00', '2017-09-13 14:10:00')
,(1132145, 184210, 'Triss', '2017-09-11 13:05:00', '2017-09-13 14:10:00')
,(1131828, 259858, 'Bogus', '2017-09-11 13:11:00', '2017-09-13 14:10:00')
,(1131844, 259858, 'Bogus', '2017-09-11 13:11:00', '2017-09-13 14:10:00')


Select Distinct 
TNr
,IDate
,Type
,COUNT(1) OVER (PARTITION BY TNr, Type, IDATE)
from @t 

结果

TNr         IDate                   Type       
----------- ----------------------- ---------- -----------
113615      2017-09-11 13:01:00.000 Bogus      1
184210      2017-09-11 13:05:00.000 Triss      1
259858      2017-09-11 13:11:00.000 Bogus      2

【讨论】:

    【解决方案2】:

    您可以如下查询:

    Select top (1) with ties ANr, Idate, [Type], Count(*) over(partition by TNr, [Type], Idate) from
        #sourcetable 
        order by row_number() over(partition by TNr, [Type], Idate order by Anr)
    

    但不确定您是如何获得 Customernr 的

    输出如下:

    +---------+-------------------------+-------+--------+
    |   ANr   |          Idate          | Type  | Amount |
    +---------+-------------------------+-------+--------+
    | 1132173 | 2017-09-11 13:01:00.000 | Bogus |      1 |
    | 1132145 | 2017-09-11 13:05:00.000 | Triss |      1 |
    | 1131828 | 2017-09-11 13:11:00.000 | Bogus |      2 |
    +---------+-------------------------+-------+--------+

    您可以使用子查询来获取row_number,如下所示

    Select * from (
        Select ANr, Idate, [Type], Amount = Count(*) over(partition by TNr, [Type], Idate) 
            ,RowN = row_number() over(partition by TNr, [Type], Idate order by Anr)
        from #sourcetable ) a
    Where a.RowN = 1
    

    【讨论】:

      【解决方案3】:
      DECLARE @t TABLE(ANr int, TNr int, Type NVARCHAR(100), IDate DATETIME, EDate DATETIME);
      
      INSERT INTO @t VALUES
      (1132173, 113615, 'Bogus', '2017-09-11 13:01:00', '2017-09-13 14:10:00')
      ,(1132145, 184210, 'Triss', '2017-09-11 13:05:00', '2017-09-13 14:10:00')
      ,(1131828, 259858, 'Bogus', '2017-09-11 13:11:00', '2017-09-13 14:10:00')
      ,(1131844, 259858, 'Bogus', '2017-09-11 13:11:00', '2017-09-13 14:10:00');
      
      SELECT MIN(ANr) ANr, TNr, IDate, EDate, COUNT(*) AS Anz
        FROM @t
        GROUP BY TNr, IDate, EDate
      

      【讨论】:

        猜你喜欢
        • 2016-12-19
        • 2019-10-11
        • 2023-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多