2012-03-30 1 views
2

für die unten stehende TabelleWie schreibe Abfrage in ORACLE und SQL_SERVER, um Datensätze mit den meisten Status zu erhalten?

tenant_id | status_id 
---------------------- 
    3  | 6 
--------------------- 
    5  | 7 
--------------------- 
    7  | 7 
-------------------- 
    3  | 7 
------------------- 
    3  | 7 
-------------------- 
    5  | 7 

wir sehen können:

mit status_id = 6
  • tenant_id = 5 hat 2 Datensatz mit status_id = 7
    • tenant_id = 3 hat 1 Rekord tenant_id = 7 hat 1 Datensatz mit status_id = 7
    • mieter_id = 3 hat 2 Datensatz mit status_id = 7

    Für gegebenes STATUS_ID_PARAM möchte ich alle Mandanten erhalten, die die meisten Datensätze mit diesem STATUS_ID_PARAM enthält. Für das obige Beispiel, für STATUS_ID_PARAM = 7 sollte die Abfrage 2 Datensätze zurück:

    tenant_id | status_id 
        -------------------- 
         3  | 7 
        -------------------- 
         5  | 7 
    

    weil die Mieter der die meisten Platten (2 für jeden) mit status_id = 7 hat.

    Ich habe versucht, so etwas, aber ich weiß nicht, wie es weitergeht oder es sein kann, ist eine andere Art und Weise:

    select tenant_id, count(status_id) s 
    from candidate 
    where status_id = STATUS_ID_PARAM 
    group by tenant_id, status_id 
    
  • Antwort

    4

    Dies funktioniert in Oracle und SQL Server

    select tenant_id, s 
    from 
        (  
        select tenant_id, 
          count(*) as s, 
          rank() over(order by count(*) desc) as rn 
        from candidate 
        where status_id = 7 
        group by tenant_id 
    ) T 
    where rn = 1; 
    

    (Getestet auf SQL Server 2005-> 2012 und Oracle 11g R2)

    +0

    Ich mag das Schlüsselwort rank(). – Turbot

    0
    select tenant_id, count(status_id) s 
    from candidate 
    where status_id = STATUS_ID_PARAM 
    group by tenant_id, status_id 
    having count(status_id) = (select max(count(status_id)) from candidate) 
    
    +0

    Edited Ich versuchte es, aber ich bekomme Fehler 'Gruppenfunktion zu verschachtelt ist deeply' – theateist

    +0

    es versuchen jetzt ... ich habe die Antwort geändert – Vikram

    +0

    das wird nicht funktionieren Kann eine Aggregatfunktion für einen Ausdruck, der ein Aggregat oder eine Unterabfrage enthält, nicht ausführen. – Turbot

    0

    Try This

    select tenant_id, count(status_id) s 
    from candidate 
    where status_id = STATUS_ID_PARAM 
    AND count(status_id) = MAX(count(status_id)) 
    group by tenant_id, status_id 
    
    +0

    dies funktioniert nicht, Sie können keine Aggrigate-Funktionen in der WHERE-Klausel verwenden –

    0

    ich die Antwort :)

    select tenant_id, count(status_id) s 
    from candidate can 
    where status_id = 7 
    group by tenant_id, status_id 
    having COUNT(status_id) 
    in 
    (
    select top 1 count(status_id) from candidate 
    group by status_id,tenant_id 
    order by COUNT(status_id) desc 
    ) 
    
    +0

    schreckliche Syntax. Nein, es wird nicht funktionieren! –

    +0

    versuche es jetzt, ich habe meine Antwort bearbeitet .. – Vikram

    +0

    @Vikram, das funktioniert nicht in Oracle – theateist

    Verwandte Themen