2017-09-13 2 views
1

Nous avons une table, appelons-la "source-table", d'où je récupère ces colonnes comme ceci;Récupérer des valeurs distinctes et un compte sur les doublons dans 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 

Le résultat ci-dessus va une nouvelle table appelée « export table » et je veux donc faire une sélection à partir d'une troisième table, « info-table », mais seulement avec ceux qui viennent inséré dans « Exporter- table « et un compte sur le nombre d'entrées dupliquées le cas échéant (en plus Anr qui est toujours unique)

avec la mention ci-dessus, sélectionnez Je veux que le résultat suivant:

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 vient de la » info- table ", qui a ANr comme clé unique. Comme vous pouvez voir les deux dernières lignes de "source-table" est identique à Anr, mais j'ai besoin de Anr plus tard pour obtenir des valeurs correctes de "info-table". Cela pourrait fonctionner sans Anr, si je peux faire une recherche sur "info-table" avec Tnr et IDate, mais j'obtiendrai aussi des entrées en double, donc je ne sais pas si ça aide.

Si quelqu'un se demande pourquoi la "table d'exportation", alors c'est une sorte de sécurité intégrée donc je ne vais pas exporter la même chose plus d'une fois.

J'ai cherché mais comme c'est une question un peu complexe je n'ai pas trouvé une solution complète ou de bons indices.

+1

Vous voulez Customernr dans le résultat, mais je ne peux pas trouver cette information dans vos données d'échantillon . – jarlh

+0

Customernr vient de la "info-table" que je n'ai pas précisé dans l'exemple. Je devrais ajouter que si cela peut être résolu d'une autre manière, alors cela pourrait suffire avec juste Anr et EDate dans le "export-table". –

Répondre

0

comment vous ne l'avez pas mis le client, le meilleur que je peux vous aider est

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 

Résultat

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 
0

Vous pouvez interroger comme ci-dessous:

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) 

Mais pas sûr comment vous avez Customernr

sortie comme ci-dessous:

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

Vous pouvez utiliser sous requête pour obtenir row_number comme ci-dessous

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