2016-06-22 9 views
0

Betrachten Sie die folgende Abfrage;Abfrage, um das Mindestdatum in der Gruppe zu finden.

SELECT id, MIN(updated_at) 
FROM accounts 
GROUP BY mem_id, account, sub_account 
HAVING COUNT(*) > 1 

Einfache Erklärung Duplikate zu finden, indem die ausgewählten Felder Gruppierung und Drucken des id und kleinsten updated_at Wert unter diesen Gruppierungen.

Das Problem, auf das ich stoße, ist, dass es den kleinsten updated_at Wert druckt, aber die id, die damit gedruckt wird, kann dem anderen doppelten Eintrag in einigen Zeilen zugeordnet werden.

Es scheint, als ob es die id in jeder Gruppierung separat (und zufällig) aus dem Minimum updated_at Wert auswählt. Wie kann ich das beabsichtigte Verhalten erhalten, das id zu assoziieren, das mit dem Minimum updated_at Wert jedes Mal verbunden wird?

Beispieldaten:

(id, mem_id, account, sub_account, updated_at) VALUES (2351, 12, 123456, 12345, 2016-04-30) 

(id, mem_id, account, sub_account, updated_at) VALUES (7638, 12, 123456, 12345, 2016-06-15) 

hier Mein Ziel ist es, die id des updated_at Wert zwischen diesen beiden zu erhalten, die den Minimalwert ist. Daher möchte ich id 2351, aber in einigen Zeilen wird es die andere ID zufällig zurückgeben.

+0

zeigen uns, Beispieldaten, aktuelle und erwartete Ergebnis \t Bitte lesen Sie [** How-to-Frage **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein toller Ort, um [** START **] (http://spaghettiba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) zu lernen, wie Verbessere deine Fragequalität und erhalte bessere Antworten. –

+0

@JuanCarlosOropeza Hinzugefügt in etwas mehr Erklärung. – SDee

+0

Haben Sie dort PK? –

Antwort

0

Könnte Sie eine subselect und eine andere Gruppe von

select id, update_at 
from accounts 
where update_at in ( 
    select MIN(updated_at) 
    FROM accounts 
    GROUP BY mem_id, account, sub_account 
    HAVING COUNT(*) > 1) 
+0

Meine Werte für "updated_at" sind nicht für jede ID identisch. Sie sind einfach Zeitstempelwerte und mein Ziel ist es, das älteste Duplikat zu entfernen. – SDee

+0

Ich habe die Antwort aktualisiert – scaisEdge

0

Die Abfrage, die ich am Ende mit verwenden müssen, dass zum größten Teil war dies gearbeitet;

SELECT a.* from accounts a 
JOIN 
(
SELECT *, MIN(updated_at) min_date 
FROM accounts 
GROUP BY mem_id, account, sub_account 
HAVING COUNT(*) > 1 
) b 
ON 
a.mem_id = b.mem_id 
AND 
a.account = b.account 
AND 
a.sub_account = b.sub_account 
AND 
a.updated_at = b.min_date 

Grundsätzlich funktioniert eine Selbstverknüpfung, um den Minimalwert von updated_at zu erhalten für jede Gruppierung dann die auf den unterschiedlichen Informationen über sie basierend Reihen übereinstimmt. In meinem Fall gab es nur 1 Duplikat für jeden Eintrag, so dass dies möglicherweise nicht für Fälle mit mehreren Duplikaten funktioniert. Dann habe ich diesen Eintrag verwendet, um die Konten zu löschen, die ich löschen musste.

Verwandte Themen