sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL-avvikelse:ANTAL(*) vs faktisk resultatuppsättning

SELECT
    a.e_id,
    coalesce(attempts, 0) attempts,
    coalesce(successes, 0) successes,
    coalesce(failures, 0) failures
FROM
    (
        SELECT e_id, count(*) as attempts FROM e_table
        WHERE e_comment LIKE '%attempt%' AND e_date BETWEEN '23-MAY-2016' AND '26-MAY-2016'
        GROUP BY e_id
    ) a
    full outer join
    (
        SELECT e_id, count(*) as successes FROM e_table
        WHERE e_comment LIKE '%success%' AND e_date BETWEEN '23-MAY-2016' AND '26-MAY-2016'
        GROUP BY e_id
    ) s
        on s.e_id = a.e_id
    full outer join
    (
        SELECT e_id, count(*) as failures FROM e_table
        WHERE e_comment LIKE '%failure%' AND e_date BETWEEN '23-MAY-2016' AND '26-MAY-2016'
        GROUP BY e_id
    ) f
        on f.e_id = coalesce(a.e_id, s.e_id)
WHERE
    coalesce(attempts, 0) <> coalesce(successes, 0) + coalesce(failures, 0)

Jag ändrade till fullständiga yttre anslutningar så att du kan verifiera att det inte finns några framgångar och/eller misslyckanden utan något matchningsförsök. Detta bör låta dig hitta e_id s där något går fel i loggningen. Det borde vara lättare att börja hantera finare siffror och inte bara listor över id-värden.

Andra har påpekat potentialen för flera försök på samma id, men är det tänkbart att en framgång och ett misslyckande båda kan registreras på samma sätt som säg i något slags återförsöksscenario? Vi vet inte hur de fullständiga kommentarerna ser ut. Som en möjlig förklaring, kan en enskild kommentar innehålla mer än ett av orden "försök", "framgång", "misslyckande"?

Här är något annat att tänka på: Är du säker på att alla dina framgångar och misslyckanden kommer att falla inom samma datumfönster? Med andra ord, finns det någon fördröjning efter försöket? Det kanske inte behöver vara särskilt lång tid om detta händer runt midnatt. Du kanske vill bredda framgångs- och misslyckandeintervallen tillräckligt mycket för att kompensera för detta (och byta till vänster yttre skarvar.)

Obs! Tillstånd i where klausulen har ändrats för att tillåta flera försök (som noterats i kommentarerna) och letar nu bara efter en balans i antalet försök kontra framgångar och misslyckanden.



  1. Hur använder jag LOAD_FILE för att infoga värde från en fil i en tabell?

  2. Hur man beställer var i fält i Laravel

  3. Om möjligt hur kan man bädda in PostgreSQL?

  4. Exportera tabell från Postgres databas (på server) till csv-fil (på lokal) i java