2016-06-17 3 views
0

Hallo Ich habe eine Tabelle redshift Tabelle von Artikeln, die ein Feld hat, das viele Konten enthalten kann. Es gibt also eine Eins-zu-viele-Beziehung zwischen Artikeln zu Konten.Anzahl der wie oft ID in Tabelle SQL Regexp

Allerdings möchte ich eine neue Ansicht erstellen, wo es die Partner-IDs in einer Spalte und in einer anderen Spalte eine Zählung wie oft die Partner-ID in der Artikeltabelle aufgeführt ist.

Ich habe versucht, dies mit Regex und erstellt eine neue Rotverschiebung Ansicht, aber bekomme seltsame Ergebnisse, wo es nicht immer richtig bauen. Eines Tages wird es sagen, dass ein Partner 15 Mal erscheint, dann die nächsten 17, dann die nächsten 15, wenn sich die Anzahl der Partner-IDs nicht geändert hat.

Jede Hilfe würde sehr geschätzt werden.

SELECT partner_id, 
 
     COUNT(DISTINCT id) 
 
FROM (SELECT id, 
 
      partner_ids, 
 
      SPLIT_PART(partner_ids,',',i) partner_id 
 
     FROM positron_articles a 
 
     LEFT JOIN util.seq_0_to_500 s 
 
       ON s.i < regexp_count (partner_ids,',') + 2 
 
       OR s.i = 1 
 
     WHERE i > 0 
 
     AND regexp_count (partner_ids,',') = 0 
 
     ORDER BY id) 
 
GROUP BY 1;

+0

Sie sagen, 'partner_ids' ist eine durch Komma getrennte Liste von Werten? –

+0

korrigieren Bozhidar, aber siehe meinen Kommentar unten, sieht aus wie das Problem war nicht mit dem oben genannten Skript, sondern vielmehr die App, die Daten zu Rotverschiebung exportiert. –

Antwort

0

die mit einigen der offensichtlichsten Dinge beginnen lassen und sehen, ob wir andere Informationen zu sammeln beginnen.

Nächste GROUP BY 1 auf Ihrer äußeren Abfrage muss GROUP BY partner_id sein.

Weiter Sie keine order by in Ihrer INNER Abfrage benötigen und der Datenbank-Engine wird wahrscheinlich tun, um eine bessere Arbeitsleistung zu optimieren, ohne es so ORDER BY id entfernen.

Wenn Sie möchten, dass Ihre endgültigen Ergebnisse bestellt werden, dann fügen Sie eine ORDER BY partner_id oder ähnliche Klausel nach Ihrer Gruppe von Ihrer OUTER Abfrage.

Es sieht aus wie es gibt auch Probleme mit, wie Sie eine partnerid von partnerids spalten, aber ich bin nicht positiv, weil ich Ihre Ansicht und die Daten, die es zu wissen, liefert müssen verstehen, wie das für partnerid Ihre Rekordzählimpuls beeinflusst.

Weiter Ihre LEFT JOIN Aussage über die util.seq_0_to_500 Ich bin ziemlich sicher, dass Sie die s.i = 1 als die erste Bedingung abfallen kann, wird davon überzeugen, dass auch weil 2 ist greater als 1. Ihr left join verhält sich jedoch eher wie ein inner join, weil Sie dann alle Nicht-Übereinstimmungen aus positron_articles ausschließen, die kein s.i > 0 haben.

Seltsamer dann Ihre gesamte beitreten und inner Abfrage verworfen Art bekommt, weil man nur Artikel wollen, die keine Kommas in ihren partnerids haben: regexp_count (partner_ids,',') = 0

würde ich vorschlagen, den Code für Ihre util.seq_0_to_500 veröffentlichen und wenn Sie eine partner table let benützen Sie das auch, da Sie Ihre Antwort wahrscheinlich viel einfacher mit dieser zusätzlichen Tabelle bekommen können, je nachdem wie regexp_count funktioniert. Ich vermute, regex_count(partnerids,partnerid) Beispiel regex_count('12345,678',1234) wird greater als 0 zurückgeben, an diesem Punkt haben Sie keine andere Wahl, als die begrenzten Strings in eine andere Tabelle zu teilen, bevor Sie eine neue Matching-Funktion zählen oder erstellen.

Wenn regex_count nur genau zwischen Komma passt, und Sie haben eine Partnertabelle Ihre Frage, da dies so einfach sein könnte:

SELECT 
    p.partner_id 
    ,COUNT(a.id) AS ArticlesAppearedIn 
FROM 
    positron_articles a 
    LEFT JOIN PARTNERTABLE p 
    ON regexp_count(a.partnerids,p.partnerid) > 0 
GROUP BY 
    p.partner_id 

Ich werde mich tatsächlich korrigieren, wie ich einen Weg, dachte nur einen Partner Tisch beitreten ohne regexp_count. Wenn Sie also eine Partner-Tabelle haben, könnte das für Sie funktionieren. Wenn nicht, müssen Sie die Strings teilen. Es prüft grundsätzlich, ob der partnerid der gesamte partnerids ist, am Anfang, in der Mitte oder am Ende von partnerids. Wenn einer davon erfüllt ist, werden die Datensätze zurückgegeben.

SELECT 
    p.partner_id 
    ,COUNT(a.id) AS ArticlesAppearedIn 
FROM 
    PARTNERTABLE p 
    INNER JOIN positron_articles a 
    ON 
     (
     CASE 
      WHEN a.partnerids = CAST(p.partnerid AS VARCHAR(100)) THEN 1 
      WHEN a.partnerids LIKE p.partnerid + ',%' THEN 1 
      WHEN a.partnerids LIKE '%,' + p.partnerid + ',%' THEN 1 
      WHEN a.partnerids LIKE '%,' + p.partnerid THEN 1 
      ELSE 0 
     END 
     ) = 1 
GROUP BY 
    p.partner_id 
+0

Es sieht tatsächlich so aus, als wäre das Problem nicht bei der Abfrage, sondern bei der Datenexport-App. Wie auch immer, dein Kommentar war sehr hilfreich, um Regex besser zu verstehen, also danke! –

Verwandte Themen