2017-07-24 1 views
0

Ich habe eine Abfrage, wo ich Fragen aus verschiedenen Kategorien auf der Grundlage ihres Schwierigkeitsgrades wollen.Wählen Sie unterschiedliche Werte aus jeder Partition über()

Es gibt Fragen, die ähnlich zu einer anderen Frage sind (ich speichere ihre Verknüpfungen in einem Feld namens "Eimer").

Nun, was ich will ist, dass nur 1 Frage aus einem Eimer zurückgegeben werden soll.

Die Abfrage ich versuche ist:

select * 
      from (
       select distinct q.bucket, 
        row_number() over (partition by dl.value order by random()) as rn, 
        dense_rank() over (partition by dl.value, LOWER(qc.value) = LOWER('general') order by random()) as rnc, 
        dl.value, qc.value as question_category, 
        q.question_text, q.option_a, q.option_b, q.option_c, q.option_d, 
        q.correct_answer, q.image_link, q.question_type 
       from 
        questions_bank q 
        inner join 
        question_category qc on qc.id = q.question_category_id 
        inner join 
        sports_type st on st.id = q.sports_type_id 
        inner join 
        difficulty_level dl on dl.id = q.difficulty_level_id 
       where st.game_type = lower('cricket') and dl.value in ('E','M','H') 
      ) s 
      where 
       (value = 'E' and rnc <= 6 and LOWER(question_category) != LOWER('general')) or 
       (value = 'E' and rnc <= 6 and LOWER(question_category) = LOWER('general')) or 
       value = 'M' and rn <= 0 or 
       value = 'H' and rn <= 0; 

Dies ist nicht die gewünschte Ausgabe zurück.

Gleiche Ausgabe lautet:

bucket | rn | rnc | value | question_category | question_text | option_a | option_b | option_c | option_d | correct_answer |     image_link     | question_type 

    2 | 2 | 2 | E  | General   | abs   | a  | b  | c  | d  | option_a  | https://d1ugevkr3ygvej.cloudfront.net/2.png | i 
    3 | 3 | 3 | E  | General   | abcd   | a  | b  | c  | d  | option_a  | https://d1ugevkr3ygvej.cloudfront.net/3.png | i 
    3 | 4 | 4 | E  | General   | abs   | a  | b  | c  | d  | option_a  |            | t 
    4 | 1 | 1 | E  | General   | image   | a  | b  | c  | d  | option_a  |            | t 

Wenn Sie bemerken, die Bucketwerte 3 als doppelten Wert enthalten. Ich möchte nicht, dass eine Kombination aus Zeilennummer und Bucket eindeutig ist. Die Priorität sollte Bucket zugewiesen werden, und dann sollten die Zeilennummern berechnet werden, aber die Partitionen sollten auf Fragekategorien basieren.

Wie kann ich darüber gehen?

Antwort

0

Die Lösung ist nicht DISTINCT zu verwenden, aber

SELECT DISTINCT ON (q.bucket) ... 

Siehe the documentation.

Dies wird nur eine Zeile pro q.bucket zurückkehren, und wenn Sie eine ORDER BY-Klausel der Abfrage hinzufügen, wird es die erste Zeile in dieser Reihenfolge wählen (sonst werden Sie die “ erste beste ” Reihe bekommen).

+0

Danke. Es war so eine einfache Lösung. –

Verwandte Themen