Prima di tutto, dubito che il risultato non è preciso? Sembra che ci siano tre "Sam" dal tavolo originale. Ma non è fondamentale per la domanda.
Poi arriviamo per la domanda stessa. In base alla tabella, il modo migliore per mostrare il valore duplicato è utilizzare la clausola count(*)
e Group by
.La query sarebbe simile a questa
SELECT OrderNo, shoppername, amountPayed, city, item, count(*) as RepeatTimes FROM dbo.sales GROUP BY OrderNo, shoppername, amountPayed, city, item HAVING COUNT(*) > 1
La ragione è che tutte le colonne insieme dal vostro tavolo identificato in modo univoco ogni record, il che significa che le registrazioni saranno considerate come duplicati solo quando tutti i valori di ogni colonna sono esattamente gli stessi , anche tu vuoi mostrare tutti i campi per i record duplicati, quindi lo group by
non mancherà nessuna colonna, altrimenti sì, perché puoi solo le colonne select
che partecipano alla clausola 'group by'.
Ora vorrei darvi qualsiasi esempio per With...Row_Number()Over(...)
, che utilizza l'espressione della tabella insieme alla funzione Row_Number.
Supponiamo di avere un tavolo quasi uguale ma con una colonna in più denominata Data di spedizione e il valore potrebbe cambiare anche se il resto è lo stesso. Eccolo:
OrderNo shoppername amountpayed city Item Shipping Date
1 Sam 10 A Iphone 2016-01-01 1 Sam 10 A Iphone 2016-02-02 1 Sam 5 A Ipod 2016-03-03 2 John 20 B Macbook 2016-04-04 3 John 25 B Macbookair 2016-05-05 4 Jack 5 A Ipod 2016-06-06
noti che fila # 2 non è un duplicato se ancora prende tutte le colonne come unità. Ma cosa succede se si desidera trattarli come duplicati anche in questo caso? Si dovrebbe usare With...Row_Number()Over(...)
, e la query sarebbe simile a questa:
WITH TABLEEXPRESSION AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier) --if you consider the one with late shipping date as the duplicate FROM dbo.sales) SELECT * FROM TABLEEXPRESSION WHERE Identifier !=1 --or use '>1'
La query sopra darà seguito insieme con data di spedizione, per esempio:
OrderNo shoppername amountpayed city Item Shipping Date Identifier 1 Sam 10 A Iphone 2016-02-02 2
Nota questo è diverso da quello con 2016-01-01, e il motivo per cui 2016-02-02 è stato filtrato è PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier
, e la data di spedizione NON è una delle colonne che devono essere prese in considerazione per i record duplicati, il che significa che con 2016-02-02 potrebbe ancora essere perfetto risultato per la tua domanda.
Ora riassumere po ', utilizzando count(*)
e Group by
clausola insieme è la scelta migliore quando si desidera solo per mostrare tutte le colonne da Group by
clausola come risultato, altrimenti vi perderete le colonne che non partecipano group by
.
Mentre per With...Row_Number()Over(...)
, è adatto in ogni scenario in cui si desidera trovare record duplicati, tuttavia, è un po 'complicato scrivere la query e un po' troppo ingegnerizzato rispetto al precedente.
Se lo scopo è eliminare i record duplicati dalla tabella, è necessario utilizzare lo WITH...ROW_NUMBER()OVER(...)...DELETE FROM...WHERE
successivo.
Spero che questo aiuti!
ho 50 campi. Quindi non c'è modo in cui senza scrivere i nomi individuali di tutti i campi posso trovare i record duplicati !! – Matthew
Fare clic con il tasto destro del mouse sulla tabella, selezionare: Tabella degli script come >> Selezionare per >> Finestra Nuovo editor di query. Ora hai la tua lista SELECT, copia e incolla nella tua sezione GROUP BY. – JerryOL