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

问题描述:

我们有一张表,我们称之为“source-table”,从中检索这些列的位置;在SQL中检索不同的值和重复计数

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 

以上的结果去一个叫“出口表”,然后我想从第三个表做一个选择新表,“信息表”,但只与那些刚插入“以出口表“并与有多少重复的条目计数,如果任何(除了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来自于”信息 - 表“,其中ANr作为唯一键。

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

如果有人想知道为什么“导出表”,那么它是一种失效保护,所以我不会多次输出相同的东西。

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

+1

您在结果要Customernr,但我无法找到你的样本数据信息。 – jarlh

+0

Customernr来自我没有在例子中指定的“信息表”。 我应该补充一点,如果可以用另一种方式解决问题,那么只需在“导出表”中使用Anr和EDate即可。 –

你怎么不把客户,我可以帮你最好是

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 

可以如下查询:

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) 

,但不知道你如何得到顾客

输出如下:

+---------+-------------------------+-------+--------+ 
| 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 

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