2016-04-27 15 views
3

ich eine Tabelle, die alle E-Mails gilt für E-Mail-Kampagnen gesendet:MYSQL Abfrage alle duplizierten Datensatz mit angegebenen Spalte finden Gruppierungen

ID | campaign_id | date_sent | date_delivered | email | status 

Status hält Lieferinformationen, DELIVERED oder UNDELIVERED. Ich möchte alle E-Mail-Adressen finden, deren Status UNDELIVERED für die letzten fünf Kampagnen ist.

Zum Beispiel [email protected] verwendet, um in Ordnung zu sein und alle Kampagnen erhalten, aber jetzt ist die E-Mail-Adresse nicht vorhanden und die letzten 5 Kampagnen-Status ist UNDELIVERED.

Bisher ich tue:

SELECT *, count(id) as occ FROM message_details WHERE status='FAILED' GROUP BY email 

Aber das ist die Summe der nicht gelieferten für jede Adresse zeigt und nicht die letzten 5.

+0

Vielleicht verstehe ich dich nicht vollständig, aber warum nicht LIMIT verwenden? – Dany

Antwort

0

zu lesen Dies kann etwas schwierig sein. Im Grunde, was es versucht zu tun, ist Top 5 Nachricht_details für jede E-Mail bekommen dann wählen Sie diejenigen mit einer Anzahl von fehlgeschlagenen Zeiten gleich 5.

Habe keine Zeit, um diesen Code zu testen.

SELECT *, count(thirdTable.id) as failTimes FROM 
(SELECT rs.id, rs.Status, rs.email 
    FROM (
     SELECT *, Rank() 
      over (Partition BY Section 
       ORDER BY RankCriteria DESC) AS Rank 
     FROM message_details 
     ) rs WHERE Rank <= 5) as thirdTable 
Where thirdTable.status = 'FAILED' GROUP BY thirdTable.email HAVING failTimes = 5 
0

die Sie interessieren,

SELECT TOP 5 CampID,COUNT(id) Occ FROM dbo.message_details 
WHERE Status = 'FAILED' 
GROUP BY CampID 
ORDER BY CampID desc 
0

Dies zu Using LIMIT within GROUP BY to get N results per group? sehr ähnlich ist, habe ich eine Antwort auf diese Stelle versucht. Was Sie abholen möchten, ist die letzte 5 fehlgeschlagene Kampagne von allen E-Mails gesendet, so scheint es, dass Ihr sql SELECT *, count(id) as occ FROM message_details WHERE status='FAILED' GROUP BY email es nicht wirklich machen kann.

Angenommen, Ihre Daten wie folgt aus:

message_details 
--- 
| ID | campaign_id | date_sent | date_delivered | email | status | 
| 1 | 1 | 2016-04-21 | null | [email protected] | FAILED | 
| 2 | 2 | 2016-04-22 | null | [email protected] | FAILED | 
| 3 | 3 | 2016-04-23 | null | [email protected] | FAILED | 
| 4 | 4 | 2016-04-24 | null | [email protected] | FAILED | 
| 5 | 5 | 2016-04-25 | null | [email protected] | FAILED | 
| 6 | 6 | 2016-04-26 | null | [email protected] | FAILED | 
| 7 | 1 | 2016-04-21 | null | [email protected] | FAILED | 
| 8 | 2 | 2016-04-22 | null | [email protected] | FAILED | 
| 9 | 3 | 2016-04-23 | null | [email protected] | FAILED | 
| 10 | 4 | 2016-04-24 | null | [email protected] | FAILED | 
| 11 | 5 | 2016-04-25 | null | [email protected] | FAILED | 
| 12 | 6 | 2016-04-26 | null | [email protected] | FAILED | 

Dann Diese SQL laufen,

SELECT t1.email, t1.campaign_id 
FROM message_details t1 
LEFT JOIN message_details t2 ON t1.email = t2.email AND t1.date_sent <= t2.date_sent 
WHERE t1.status='FAILED' 
GROUP BY t1.email, t1.campaign_id, t1.date_sent 
HAVING COUNT(*) <= 5 

ich unten habe gesetzt Ergebnis

| email | campaign_id | 
| [email protected] | 2 | 
| [email protected] | 3 | 
| [email protected] | 4 | 
| [email protected] | 5 | 
| [email protected] | 6 | 
| [email protected] | 2 | 
| [email protected] | 3 | 
| [email protected] | 4 | 
| [email protected] | 5 | 
| [email protected] | 6 | 

Ich weiß nicht, ob das funktioniert für Sie, aber Sie können auf den obigen Link schauen. Und wenn Sie eine Lösung für Ihren Beitrag haben, teilen Sie es mir mit.

Verwandte Themen