0
votes

SQL Server: Créez un groupe de n lignes chacun et donnez un numéro de groupe pour chaque groupe

Je souhaite créer une requête SQL qui sélectionne une colonne id 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 min (ID) en tant que groupe pour chaque groupe. La commande doit être ASC sur la colonne id . xxx

J'ai essayé des solutions avec Row_Number () et dense_rank () . Et aussi cette requête: xxx


1 commentaires

Utilisez Ntile dans SQLServer


3 Réponses :


1
votes

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;


0 commentaires

2
votes

Utilisez Row_Number () Pour énumérer les lignes, arithmétique pour affecter le groupe, puis prendre le minimum de l'identifiant : xxx

Il est possible de le faire sans subquiery, mais la logique est plutôt désordonnée: xxx


2 commentaires

Existe-t-il un besoin pour plancher 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.



0
votes
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

1 commentaires

2 Les analyses de la table semblent un peu pour cela, lorsqu'il peut facilement être réalisé avec 1.