2017-08-16 3 views
0

Est-il possible de sélectionner les 50 premières lignes dans Postgres avec select * from yellow_tripdata_staging fetch first 50 rows only et après qui trient les résultats par colonne?Sélectionnez les 50 premières lignes puis commandez

Si oui, comment? Edit: la table est vraiment grande, et ce n'est pas vraiment important quelles lignes je reçois. Cette question était parce que j'utilisais Redash pour visualiser les données et obtenais un ordre étrange sur les résultats triés. Alors j'ai réalisé que la colonne que j'utilisais pour commander n'était pas numérique mais char, qui cause des valeurs comme 11 et 10 à venir avant 2 et 3.

Je suis désolé pour cette question stupide

+4

Les «50 premières lignes» d'une table SQL ou d'un jeu de résultats non ordonné sont inconnus. Vous devez être plus précis sur ce que vous voulez accomplir. –

+0

oh oui, c'était comme tu l'as dit dans "juste pour aller chercher" le premier "50 rangs selon l'ordre physique actuel" j'ai oublié cette question –

Répondre

1

Il est pas tout à fait clair comment vos 50 premières lignes sont identifiées et dans quel ordre ils doivent être retournés. Il n'y a pas d '"ordre naturel" dans les tables d'une base de données relationnelle. Aucune garantie sans explicite ORDER BY.

Cependant, il est un ordre physique actuel de lignes que vous pouvez (ab-) utiliser. Et par défaut, c'est l'ordre dans lequel les lignes ont été insérées - tant que rien d'autre n'est arrivé à cette table. Mais le SGBDR est libre de changer l'ordre physique à tout moment, donc l'ordre physique n'est pas fiable. Les résultats peuvent et vont changer avec les opérations d'écriture dans la table (y compris VACUUM ou d'autres commandes d'utilitaire). Appelons votre colonne utilisée pour trier après 50 lignes sort_col.

( -- parentheses required 
TABLE yellow_tripdata_staging LIMIT 50 
) 
UNION ALL 
( -- parentheses required 
SELECT * 
FROM (TABLE yellow_tripdata_staging OFFSET 50) sub 
ORDER BY sort_col 
); 

Plus explication (incl. TABLE et entre parenthèses):

Ou, en supposant sort_col est défini NOT NULL :

SELECT * 
FROM yellow_tripdata_staging 
ORDER BY CASE WHEN row_number() OVER() > 50 THEN sort_col END NULLS FIRST; 

La fonction de fenêtre row_number() est autorisé à apparaître dans la clause ORDER BY.

row_number() OVER() (avec la clause vide OVER) joindra les numéros de série en fonction de l'ordre physique actuel des lignes - toutes les clauses de non-responsabilité ci-dessus s'appliquent toujours.

L'expression CASE remplace les 50 premiers numéros de ligne par NULL, triés en premier en raison de NULLS FIRST joint. En effet, les 50 premières lignes ne sont pas triées, le reste est trié par sort_col.

Ou, si vous voulez dire en fait de prendre les 50 premières lignes selon sort_col et les laisser non triés, tandis que le reste est à trier:

Ou, si vous voulez juste aller chercher les "premières" 50 rangées selon l'ordre physique actuel ou d'autres critères non divulgués (plus fiables), vous avez besoin d'une sous-requête ou d'un CTE pour trier ces 50 rangées dans l'extérieur SELECT:

SELECT * 
FROM (TABLE yellow_tripdata_staging LIMIT 50) sub 
ORDER BY sort_col; 

Vous devez définir clairement vos besoins.

0

Vous pouvez commander par deux différentes colonnes. Par exemple:

select yts.* 
from (select yts.*, 
      row_number() over (order by id) as seqnum 
     from yellow_tripdata_staging yts 
    ) yts 
order by (seqnum <= 50)::int desc, 
     (case when seqnum <= 50 then id end), 
     col