Considérez le tableau suivant dans SQL Server:
Je veux écrire une requête SQL pour générer la colonne Par exemple, pour la catégorie A, la colonne 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> indicateur code>. Cette colonne doit être définie sur 1 sur la première occurrence de drapeau = 1 code> pour chaque catégorie. P> 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> 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 Réponses :
Un moyen d'utiliser une table dérivée et min () code> pour déterminer qui est la première date d'une catégorie qui a le drapeau. Joignez-vous à cela à la table d'origine.
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
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.
Je pense utiliser l'utilisation de la fonction min () code> en tant que fonction de fenêtre:
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 i> 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 code> 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?