-1
votes

SQL Server: Créez une colonne en fonction de la première occurrence d'une valeur dans une autre colonne.

Considérez le tableau suivant dans SQL Server:

 Entrez la description de l'image ici p>

Je veux écrire une requête SQL pour générer la colonne indicateur code>. Cette colonne doit être définie sur 1 sur la première occurrence de drapeau = 1 code> pour chaque catégorie. P>

Par exemple, pour la catégorie A, la colonne drapeau code> est défini sur 1 pour les dates 1/3/2019, 1/4/2019, 1/5/2019, 1 / 6/2019. Depuis 1/3/2019, est la date la plus ancienne lorsque drapeau code> a été défini sur 1, la colonne code> indicateur code> pour cet enregistrement doit également être réglée sur 1. p>

Quelle requête SQL Server devrais-je écrire pour cela? P>

PS: la figure montre déjà la sortie souhaitée pour la colonne code> indicateur code>. p>

ci-dessous est le code pour générer la table dans SQL Server: P>

CREATE TABLE myTable
(
    Category CHAR(1),
    Date DATE,
    Flag INT
)

INSERT INTO myTable (Category, Date, Flag) 
VALUES ('A', '2019-01-01', 0), ('A', '2019-02-01', 0),
       ('A', '2019-03-01', 1), ('A', '2019-04-01', 1),
       ('A', '2019-05-01', 1), ('A', '2019-06-01', 1),
       ('B', '2019-01-01', 0), ('B', '2019-02-01', 0),
       ('B', '2019-03-01', 0), ('B', '2019-04-01', 0),
       ('B', '2019-05-01', 1), ('B', '2019-06-01', 1),
       ('C', '2019-01-01', 0), ('C', '2019-02-01', 0),
       ('C', '2019-03-01', 0), ('C', '2019-04-01', 1),
       ('C', '2019-05-01', 1), ('C', '2019-06-01', 1),
       ('C', '2019-07-01', 1)


3 commentaires

Voir Pourquoi devrais-je fournir un MCRE pour ce qui me semble être une requête SQL très simple


Mysql <> SQL Server. S'il vous plaît seulement marquer les SJB que vous êtes vraiment en utilisant. En outre, les images ne sont pas utiles pour ceux que vous demandez de l'aide. Poster des données comme ce qu'il est, texte et affiche les résultats que vous êtes après et vos tentatives de votre question; expliquer pourquoi ils ne fonctionnent pas.


Est-ce que cela répond à votre question? Sélectionnez la première ligne de chaque groupe par groupe?


3 Réponses :


2
votes

Un moyen d'utiliser une table dérivée et min () pour déterminer qui est la première date d'une catégorie qui a le drapeau. Joignez-vous à cela à la table d'origine.

Demo < Pré> xxx


0 commentaires

0
votes

Une autre manière

Démo P>

CREATE TABLE myTable
 (
    Category char(1),
    Date date,
    Flag int
 )

        INSERT INTO myTable (Category, Date, Flag) VALUES
        ('A','2019-01-01',0),
        ('A','2019-02-01',0),
        ('A','2019-03-01',1),
        ('A','2019-04-01',1),
        ('A','2019-05-01',1),
        ('A','2019-06-01',1),
        ('B','2019-01-01',0),
        ('B','2019-02-01',0),
        ('B','2019-03-01',0),
        ('B','2019-04-01',0),
        ('B','2019-05-01',1),
        ('B','2019-06-01',1),
        ('C','2019-01-01',0),
        ('C','2019-02-01',0),
        ('C','2019-03-01',0),
        ('C','2019-04-01',1),
        ('C','2019-05-01',1),
        ('C','2019-06-01',1),
        ('C','2019-07-01',1);

    select t.* , 
    CASE WHEN T.FLAG=1 AND FIRST_VALUE(T.DATE) OVER (PARTITION BY T.Category ORDER BY t.FLAG desc, t.Date asc)=T.DATE THEN 1 
   ELSE 0 END Indicator
    from myTable t
    order by t.Category, t.date


3 commentaires

La sortie de cette instruction SQL ne satisfait pas les exigences.


Pourquoi? Le résultat est égal à l'image


Désolé, vous êtes correct. J'ai interprété à tort et donc comme ma réponse. Je vais supprimer ma réponse.



1
votes

Je pense utiliser l'utilisation de la fonction min () en tant que fonction de fenêtre: xxx


0 commentaires