1 messaggio dal 03 agosto 2006
ciao a tutti
ho questo script che mi elimina i record doppi in una tabella di un database sql server, funziona benissimo però mi necessitava che eliminasse i doppioni più recenti lasciando i meno recenti, nella tabella mailing c'è anche il campo data.

è possibile farlo ? ho provato in più maniere ma non ci sono riuscita

-----------------------------------------------------------
sql="DELETE mailing FROM mailing a LEFT JOIN (SELECT max(mail_id) as idtabella from mailing GROUP BY email) b ON a.mail_id = b.idtabella WHERE b.idtabella is null "
set rs=db.execute(sql)
-------------------------------------------------------------
252 messaggi dal 03 novembre 2003
ciao
ho provato a fare una cosa veloce in Access.
Ho creato una tabella con questi valori (3 colonne)

La prima colonna è valore univoco
1 | A | 01/06/2014
2 | A | 02/07/2014
3 | B | 05/04/2014
4 | C | 07/05/2014
5 | A | 10/01/2014

Da questa ho fatto:
SELECT Last(Tabella1.Id) AS UltimoDiId
FROM Tabella1
GROUP BY Tabella1.Valore

Quindi ho risultato 3,4 e 5

questa query quindi la uso come WHERE Campo Not In nella stessa tabella come DELETE

DELETE Tabella1 WHERE CampoId Not In(
  SELECT Last(Tabella1.Id) AS UltimoDiId
   FROM Tabella1
  GROUP BY Tabella1.Valore
)





Prova a vedere un po...

it's not difficult to write, but is difficult write that you mean
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
personalmente otterrei le righe da eliminare per esclusione...
utilizzando le funzionalita' di windowing, partizionando per l'elemento raggruppante (l'email), otterrai un ordinamento partizionato per ciascuna email... dovremo quindi eliminare le righe che nell'ordinamento partizionato abbiano una ordinalita' superiore a 1...
trivialmente
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
  mail_id int,
  mail varchar(10),
  data date
  );
INSERT INTO dbo.t
  VALUES (1, 'A', '20140601'), (2, 'A', '20140702'), (3, 'B', '20140405'), (4, 'C', '20140507'), (5, 'A', '20140110');
GO

WITH cteNumbered AS (
  SELECT mail_id, ROW_NUMBER() OVER (PARTITION BY mail ORDER BY data) AS rn
    FROM dbo.t t
  ),
cte AS (
  SELECT mail_id
    FROM cteNumbered c
    WHERE c.rn <> 1
  )
DELETE dbo.t
  FROM dbo.t t JOIN cte ON cte.mail_id = t.mail_id;

SELECT * FROM dbo.t
GO
DROP TABLE dbo.t;
--<-----
mail_id     mail       data
----------- ---------- ----------
3           B          2014-04-05
4           C          2014-05-07
5           A          2014-01-10

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.