2017-11-03 3 views
1

So habe ich die Situation, wo ich eine Liste von "Calls" und entsprechende "Bilder" durch eine Spalte "CallId" verknüpft haben.Wie Top 2 Datensätze zurückgegeben werden, wenn "Where ID in"

So habe ich 3 Anrufe:

  • Anruf, Id 1
    • Bild 1
    • Bild 2
    • Bild 3
    • Bild 4
  • Anruf, Id 2
    • Bild 5
  • Anruf, Id 3
    • Bild 6

So zur Zeit kann ich alle Bilder für diese drei Anrufe erhalten, indem eine Sql mit Where Id In so:

Select * from [Images] Where CallId in (1,2,3)

Jetzt gibt diese alle der Images für die 3 Anrufe, aber in meiner Anwendung zeige ich nur top 2 daher ist es möglich, nur 2 Bilder für jeden Anruf zurückzukehren.

Ich habe versucht:

Select * from [Images] Where CallId in (1,2,3) Limit 2

aber nur, kehrt 2 Bilder insgesamt für maximal 6 Bilder Ich bin auf der Suche?

z. mit meinem Beispiel möchte ich einige SQL ausführen, die

  • Bild 1
  • Bild 2
  • Bild 5
  • Bild 6
+0

SQL Server unterstützt "Limit" nicht, also nehme ich an, dass Sie SQLite verwenden. –

+0

@GordonLinoff Sie haben Recht. Mein schlechtes – user1

+0

Ich verstehe diese Frage nicht, können Sie mehr über das erklären, was Sie begrenzen möchten? –

Antwort

1

Da es in sqlite keine Fensterfunktionen gibt, müssen Sie self join verwenden.Diese Lösung geht davon aus, dass es eine einmalige id für jedes Bild, und sie werden nach dem datetaken Attribut sortiert (wie Sie in den Kommentaren erwähnen)

select t.callid, t.id 
from 
(
    select i1.callid, i1.id, count(*) row_count 
    from image i1 
    join image i2 on i1.CallId = i2.CallId and 
        i1.datetaken <= i2.datetaken and 
        i1.callid in (1,2,3) 
    group by i1.callid, i1.id 
) t 
where t.row_count <= 2 

Die obige Lösung 2 Bilder mit dem höchsten Wert datetaken pro callid finden. wenn Sie die niedrigste Verwendung i1.datetaken >= i2.datetaken stattdessen benötigen. Das Problem kann auftreten, wenn Sie Bilder in Callid mit demselben datetaken Wert haben (diese Lösung entspricht dense_rank()). Lassen Sie mich wissen, ob das ausreicht. Die Bedingung in Self-Join für row_number() wäre komplexer.

1

Sie können Verwenden Sie die Row_Number Funktion zurückkehren würde. Die unten Abfrage werden die Top-2-Bilder für jeden Anruf zurückzukehren (Angenommen, es ist ein Colum Called ImgId - Ändern Sie ihn auf jede Spalte, die Sie wünschen bestellen)

SELECT 
    * 
    FROM 
    (
SELECT 
    SeqNo = (SELECT COUNT(1) FROM [Images] WHERE CallId = i.CallId and ImgId >= I.ImgId), 
    * 
    FROM [Images] i 
)q 
    WHERE SeqNo <3 

wenn Sie benötigen andere zählen, die 2 dann nur Ändern Sie die Where-Bedingung in eine beliebige Zahl. Sie können auch eine Variable verwenden, um sie dynamischer und generischer zu machen.

Verwandte Themen