Je souhaite créer une requête SQL qui sélectionne une colonne code> id code> et ajoute une colonne supplémentaire à la requête qui est un numéro de groupe comme indiqué dans la sortie ci-dessous.
Chaque groupe est composé de 3 lignes et doit avoir le J'ai essayé des solutions avec min (ID) code> en tant que groupe code> code> pour chaque groupe. La commande doit être ASC code> sur la colonne code> id code>. P> Row_Number () code> et dense_rank () code>. Et aussi cette requête: p>
3 Réponses :
supposer que vous voulez la valeur la plus basse du groupe, et ils sont toujours des groupes de 3, plutôt que le ntile code> (comme Saravantn suggère, ce qui divise les données dans ce nombre de groupes même (ish)) , vous pouvez utiliser quelques fonctions de fenêtre: WITH Grps AS(
SELECT V.ID,
(ROW_NUMBER() OVER (ORDER BY V.ID) -1) / 3 AS Grp
FROM (VALUES(100),
(101),
(102),
(103),
(104),
(105),
(106),
(107),
(108))V(ID))
SELECT G.ID,
MIN(G.ID) OVER (PARTITION BY G.Grp) AS GroupNr
FROM Grps G;
Utilisez Il est possible de le faire sans subquiery, mais la logique est plutôt désordonnée: p> Row_Number () CODE> Pour énumérer les lignes, arithmétique pour affecter le groupe, puis prendre le minimum de l'identifiant code>:
Existe-t-il un besoin pour plancher code> lorsque l'entier arithmétique signifie qu'une valeur décimale ne peut pas être renvoyée?
@Larnu. . . Non, il est superflu avec SQL Server. J'ai tendance à le mettre, car la plupart des bases de données ne font pas de division entière.
SELECT T2.ID, T1.ID
FROM (
SELECT MIN(ID) AS ID, GroupNr
FROM
(
SELECT ID, ( Row_number()OVER(ORDER BY ID) - 1 ) / 3 + 1 AS GroupNr
FROM Table
) AS T1
GROUP BY GroupNr
) AS T1
INNER JOIN (
SELECT ID, ( Row_number()OVER(ORDER BY ID) - 1 ) / 3 + 1 AS GroupNr
FROM Table
) T2 ON T1.GroupNr = T2.GroupNr
2 Les analyses de la table semblent un peu pour cela, lorsqu'il peut facilement être réalisé avec 1.
Utilisez Ntile dans SQLServer