在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的情况下运行,但是我也会在那里得到重复条目,所以不确定是否有帮助。
如果有人想知道为什么“导出表”,那么它是一种失效保护,所以我不会多次输出相同的东西。
我一直在寻找,但由于这是一个有点复杂的问题,我还没有找到一个完整的解决方案或任何好的提示。
答
你怎么不把客户,我可以帮你最好是
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
您在结果要Customernr,但我无法找到你的样本数据信息。 – jarlh
Customernr来自我没有在例子中指定的“信息表”。 我应该补充一点,如果可以用另一种方式解决问题,那么只需在“导出表”中使用Anr和EDate即可。 –