it-swarm.com.de

So wählen Sie die ersten 100 Zeilen in Oracle aus

Meine Anforderung ist, die neueste Bestellung jedes Kunden zu erhalten und dann die Top 100-Datensätze zu erhalten.

Ich habe eine Abfrage wie folgt geschrieben, um die neuesten Bestellungen für jeden Kunden zu erhalten. Interne Abfrage funktioniert gut. Aber ich weiß nicht, wie ich die ersten 100 basierend auf den Ergebnissen bekomme.

    SELECT * FROM (
      SELECT id, client_id, ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn 
      FROM order
    ) WHERE rn=1

Irgendwelche Ideen? Vielen Dank.

31
user2321728

Angenommen, create_time enthält die Zeit, zu der die Bestellung erstellt wurde, und Sie möchten die 100 Kunden mit den neuesten Bestellungen.

  • fügen Sie die create_time in Ihre innerste Abfrage ein
  • ordnen Sie die Ergebnisse Ihrer äußeren Abfrage mit dem create_time desc
  • fügen Sie eine äußerste Abfrage hinzu, die die ersten 100 Zeilen mit ROWNUM filtert.

Abfrage: 

  SELECT * FROM (
     SELECT * FROM (
        SELECT 
          id, 
          client_id, 
          create_time,
          ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn 
        FROM order
      ) 
      WHERE rn=1
      ORDER BY create_time desc
  ) WHERE rownum <= 100

UPDATE für Oracle 12c

Mit Version 12.1 führte Oracle "echte" Top-N-Abfragen ein. Mit der neuen FETCH FIRST...-Syntax können Sie auch Folgendes verwenden:

  SELECT * FROM (
    SELECT 
      id, 
      client_id, 
      create_time,
      ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn 
    FROM order
  ) 
  WHERE rn = 1
  ORDER BY create_time desc
  FETCH FIRST 100 ROWS ONLY)
34
Frank Schmitt

sie sollten Rownum in Oracle verwenden, um das zu tun, wonach Sie suchen

where rownum <= 100

sehen Sie auch diese Antworten, um Ihnen zu helfen

Limit in Oracle

Top in Oracle auswählen

Oben in Oracle 2 auswählen

28
Moneer Kamal

Wie Moneer Kamal sagte, können Sie das einfach tun:

SELECT id, client_id FROM order 
WHERE rownum <= 100
ORDER BY create_time DESC;

Beachten Sie, dass die Bestellung abgeschlossen ist nach Erhalten der 100-Zeile. Dies kann nützlich sein, wenn Sie nicht bestellen möchten.

0
Usama

Erste 10 Kunden in db (Tischkunden) eingefügt:

select * from customers where customer_id <=
(select  min(customer_id)+10 from customers)

Last 10 customers inserted into db (table customers):

select * from customers where customer_id >=
(select  max(customer_id)-10 from customers)

Hoffe das hilft....

0
Lorenzo