1
votes

Génération automatique du numéro de série

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


6 commentaires

Que voulez-vous dire, chaque autre identifiant du lendemain est +1?


On dirait plus que vous voulez DENSE_RANK pas ROW_NUMBER , cependant, pourquoi la deuxième ligne n'a-t-elle aucune valeur pour s.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 exemple cast (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.


4 Réponses :


1
votes

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


0 commentaires

2
votes

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;


1 commentaires

Attendre le résultat sans utiliser CASE



2
votes

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

sqlfiddle


2 commentaires

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



1
votes

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

 entrez la description de l'image ici


2 commentaires

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