在SQL中检索不同的值和重复项的计数

时间:2017-09-13 12:43:44

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

我们有一个表,我们称之为“source-table”,我从这里检索这些列;

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为唯一键。

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

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

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

3 个答案:

答案 0 :(得分:0)

你怎么没有把顾客,最好的我可以帮助你

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

答案 1 :(得分:0)

您可以查询如下:

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

答案 2 :(得分:0)

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