J'ai une table. dans lequel, il y a 12 enregistrements disponibles. dans ceux que je veux filtrer et obtenir des données comme de la colonne de source de valeur de cellule hp à avant les enregistrements de colonne de source de valeur de cellule hp.
Voici le tableau:
seq_id file_name source date
b21345350 a.txt ad 2022-04-15
b32145660 e.txt qe 2022-04-15
c43526890 ace.txt hp 2022-04-15
re2345566 wer.csv hp 2022-04-15
b43251044 op.xlsx fa 2022-04-15
b6512400 ip.csv jm 2022-04-15
b9123420 tb.xlsx tp 2022-04-15
b3214563 cv.txt ux 2022-04-14
b45678900 em.txt hp 2022-04-14
b65357023 rt.csv hp 2022-04-14
b90879081 ty.txt mp 2022-04-14
b19019019 sd.txt jp 2022-04-14
Ici, il devrait être le résultat de sortie :
seq_id file_name source date
c43526890 ace.txt hp 2022-04-15
re2345566 wer.csv hp 2022-04-15
b43251044 op.xlsx fa 2022-04-15
b6512400 ip.csv jm 2022-04-15
b9123420 tb.xlsx tp 2022-04-15
b3214563 cv.txt ux 2022-04-14
Solution du problème
Il n'y a pas d'ordre naturel des lignes dans une base de données relationnelle (comme dans une feuille de calcul). Voir:
- Sélectionner les n dernières lignes sans utiliser la clause order by
- Ordre de tri déterministe pour les fonctions de fenêtre
En supposant qu'une id
colonne établisse l'ordre des lignes que vous semblez tenir pour acquis (et n'est pas ), cela fonctionnerait :
SELECT (t).*
FROM (
SELECT t, count(*) FILTER (WHERE source = 'hp') OVER (ORDER BY id) AS hp_ct
FROM tbl t
) sub
WHERE hp_ct BETWEEN 1 AND 2;
db<>violon ici
Vous semblez vouloir toutes les lignes commençant par la première instance de source = 'hp'
et s'arrêtant à la 3ème instance de la même chose. Faites donc un décompte courant dans la sous-requête sub
, puis filtrez toutes les lignes avec le décompte 1 et 2.
Je travaille avec un alias de table t
pour saisir toute la ligne et décomposer à l'extérieur SELECT
pour me débarrasser de l'ajout hp_ct
sans épeler tous les noms de colonne. C'est facultatif.
Aucun commentaire:
Enregistrer un commentaire