Announcement

Collapse
No announcement yet.

Select Problem - Neueste x Einträge selectieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Select Problem - Neueste x Einträge selectieren

    Hallo,

    wie kann ich denn die 3 neusten Einträge einer Tabelle am elegantesten selectieren?

    Ich könnte das schreiben:
    SELECT * FROM meinetabelle where a = 4711 order by datumsfeld desc

    und mir im Programm dann nur die obersten 3 Einträge anschauen. Aber sonderlich schön ist es ja nicht, dass ich dann immer ein paar tausend Datensätze zurück bekomme.

    Viele Grüße

  • #2
    Das würde natürlich noch gehen:
    select * from
    (SELECT * FROM meinetabelle where a = 4711 order by datumsfeld desc)
    where rownum <= 3

    Geht das auch noch anders?

    Comment


    • #3
      So viele andere Möglichkeiten gibt es nicht, ausser vielleicht
      [highlight=sql]with t as
      (SELECT * FROM meinetabelle where a = 4711 order by datumsfeld desc)
      select * from t
      where rownum <= 3[/highlight]
      Sieht meiner Meinung nach übersichtlicher aus und ist unter entsprechenden Umständen schneller weil Oracle ggf. eine temporäte Tabelle erstellt und die Daten dort zwischenspeichert.

      Gruss

      Comment


      • #4
        Hallo Wernfried,
        danke für deine Antwort! Dann werd ichs wohl mal so machen müssen ;-)

        Grüße

        Comment


        • #5
          Besonders wenn es mehrere "gleichartige" neue Einträge, z.B. mit identischem Daten gibt und diese Berücksichtigung finden sollen können auch analytische Funktionen verwendet werden, die Unterschiede zeigen sich in den letzten drei Spalten:
          Code:
          WITH meinetabelle AS 
           (
             SELECT 1 id, 4711 a, to_date('11.06.2012','DD.MM.YYYY') datumsfeld FROM dual UNION ALL
             SELECT 2   , 4711  , to_date('12.06.2012','DD.MM.YYYY') datumsfeld FROM dual UNION ALL
             SELECT 3   , 4711  , to_date('12.06.2012','DD.MM.YYYY') datumsfeld FROM dual UNION ALL
             SELECT 4   , 4711  , to_date('13.06.2012','DD.MM.YYYY') datumsfeld FROM dual UNION ALL
             SELECT 5   , 4711  , to_date('13.06.2012','DD.MM.YYYY') datumsfeld FROM dual UNION ALL
             SELECT 6   , 4711  , to_date('14.06.2012','DD.MM.YYYY') datumsfeld FROM dual 
            )
          SELECT id, a, datumsfeld,
                 ROW_NUMBER() OVER (ORDER BY datumsfeld desc) rnum,
                 RANK()       OVER (ORDER BY datumsfeld desc) rnk,
                 DENSE_RANK() OVER (ORDER BY datumsfeld desc) drnk
           FROM meinetabelle;
          
          id        a     datumsfeld    rnum    rnk    drnk
          -----------------------------------------------------------------
          6	4711	14.06.2012       1	1	1
          4	4711	13.06.2012       2	2	2
          5	4711	13.06.2012       3	2	2
          2	4711	12.06.2012       4	4	3
          3	4711	12.06.2012       5	4	3
          1	4711	11.06.2012       6	6	4
          Das Ergebnis kann dann in einer äußeren Abfrage nach rnum, rnk, oder drnk gefiltert werden.

          Comment

          Working...
          X