web-dev-qa-db-fra.com

Comment sélectionner les 100 premières lignes dans Oracle?

Mon exigence est d’obtenir la dernière commande de chaque client, puis les 100 meilleurs enregistrements.

J'ai écrit une requête comme ci-dessous pour obtenir les dernières commandes pour chaque client. La requête interne fonctionne bien. Mais je ne sais pas comment obtenir les 100 premiers sur la base des résultats.

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

Des idées? Merci.

31
user2321728

En supposant que create_time contienne l'heure à laquelle la commande a été créée et que vous voulez les 100 clients avec les dernières commandes, vous pouvez:

  • ajoutez le create_time dans votre requête la plus profonde
  • classer les résultats de votre requête externe par le create_time desc
  • ajouter une requête la plus externe qui filtre les 100 premières lignes à l'aide de ROWNUM

Question: 

  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 pour Oracle 12c

Avec la version 12.1, Oracle introduisit "vraies" requêtes Top-N . En utilisant la nouvelle syntaxe FETCH FIRST..., vous pouvez également utiliser:

  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

vous devriez utiliser rownum dans Oracle pour faire ce que vous cherchez

where rownum <= 100

voir aussi ces réponses pour vous aider

limite dans Oracle

sélectionnez top dans Oracle

sélectionnez top dans Oracle 2

28
Moneer Kamal

10 premiers clients insérés dans la base de données (clients de la table):

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)

J'espère que cela t'aides....

0
Lorenzo