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_RANKpasROW_NUMBER, cependant, pourquoi la deuxième ligne n'a-t-elle aucune valeur pours.no,flt_id < / code> etflight? 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.