Problème de génération automatique du numéro de série.
Comment puis-je utiliser row_number ()
de manière appropriée ou existe-t-il une alternative pour obtenir les résultats escomptés?
Remarque: Je veux écrire une requête sans utiliser CASE
.
+------+--------+-------------------------+ | sno | flight | flightDate | +------+--------+-------------------------+ | 1 | 3K0722 | 2019-01-08 17:10:00.000 | | | | 2019-01-08 20:20:00.000 | | 2 | 3K0723 | 2019-01-09 17:10:00.000 | | 3 | 3K0724 | 2019-01-10 20:20:00.000 | +------+--------+-------------------------+
Résultats actuels:
+------+--------+-------------------------+ | sno | flight | flightDate | +------+--------+-------------------------+ | 1 | 3K0722 | 2019-01-08 17:10:00.000 | | 2 | 3K0722 | 2019-01-08 20:20:00.000 | | 3 | 3K0723 | 2019-01-09 17:10:00.000 | | 4 | 3K0724 | 2019-01-10 20:20:00.000 | +------+--------+-------------------------+
Résultats attendus:
SELECT row_number() over (order by COALESCE(legs.sta, legs.eta) ASC) sno, legs.Flight_ID flightId, legs.flight, legs.flightDate FROM Flt_OperativeFlight_Legs LEG ORDER BY COALESCE(legs.sta, legs.eta) ASC
4 Réponses :
Vous pouvez utiliser DENSE_RANK
au lieu de ROW_NUMBER
SELECT DENSE_RANK() over (order by COALESCE(legs.sta, legs.eta, legs.ata) ASC) as "s.no", legs.Flight_ID flightId ,legs.flight ,legs.flightDate FROM Flt_OperativeFlight_Legs LEG ORDER BY COALESCE(legs.sta, legs.eta, legs.ata) ASC
Vous avez besoin d'un autre row_number ()
:
SELECT DENSE_RANK() OVER (ORDER BY flt_id, flight) AS Sr, (CASE WHEN Seq = 1 THEN flightId END) AS Flight_ID, (CASE WHEN Seq = 1 THEN flight END) AS flight, flightDate FROM (SELECT ROW_NUMBER() OVER(PARTITION BY Flight_ID, flight ORDER BY flightDate) AS Seq, legs.Flight_ID flightId, legs.flight, legs.flightDate FROM Flt_OperativeFlight_Legs LEG ) l;
Attendre le résultat sans utiliser CASE
Vous pouvez essayer d'utiliser la fonction de fenêtre ROW_NUMBER
dans une sous-requête, puis utiliser la fonction de fenêtre DENSE_RANK
pour créer une colonne no
avec CASE WHEN
expression obtient la ligne rn = 1
.
SELECT (CASE WHEN rn = 1 THEN DENSE_RANK() over(order by flight) END) no, (CASE WHEN rn = 1 THEN flt_id END) flt_id, (CASE WHEN rn = 1 THEN flight END) flight, flightDate FROM ( SELECT *,ROW_NUMBER() OVER(PARTITION BY flt_id,flight ORDER BY flightDate) rn FROM Flt_OperativeFlight_Legs ) t1
Attendre le résultat sans utiliser CASE
@SantoshJadi Y a-t-il une raison pour laquelle vous souhaitez obtenir un résultat sans utiliser CASE
Veuillez vous référer à la solution suivante, pour vider les données répétitives dont j'avais besoin pour utiliser l'expression CASE
Dans l'expression CTE, j'ai utilisé les fonctions Row_Number et Dense_Rank en combinaison avec Clause Partition By
;with cte as ( select ROW_NUMBER() over (order by flight, flightDate) as num, DENSE_RANK() over (order by flight) as [no], ROW_NUMBER() over (partition by flight order by flightDate) as rn, flight, flightDate from Flt_OperativeFlight_Legs legs ) select case when rn > 1 then null else [no] end as [no], case when rn > 1 then null else flight end as flight, flightDate from cte order by num
La sortie est comme suit
Attendre le résultat sans utiliser CASE
.
Oui, je l'ai lu. Mais ne pouvait pas comprendre la raison derrière. Pour convertir des valeurs répétitives, une instruction CASE est requise. Sinon, les valeurs NULL ou les valeurs de chaîne vides ne seront pas vues
Que voulez-vous dire, chaque autre identifiant du lendemain est +1?
On dirait plus que vous voulez
DENSE_RANK
pasROW_NUMBER
, cependant, pourquoi la deuxième ligne n'a-t-elle aucune valeur pours.no
,flt_id < / code> et
flight
? Je suppose que c'est une question de présentation, mais si c'est le cas, vous devriez le gérer dans votre couche de présentation, pas dans le moteur de données.Pourquoi
Coalesce
? Pourquoi pas par exemplecast (FlightDate as date)
? Vos résultats attendus sont classés et classés par date dans FlightDate@Larnu à cause du même vol.
@PanagiotisKanavos oui. ça peut être fait.
Ensuite, je maintiens ma déclaration @SantoshJadi; faites cela dans votre couche de présentation.