3 votes

Ajouter un compteur à des données regroupées en T-SQL

Je tente de produire une requête qui affiche une colonne qui incrémente (compte) pour chaque groupe de données. L'ordre global des résultats n'a pas d'importance, sauf que l'occurrence doit être comptée par date (la plus ancienne = 1) et doit être réinitialisée pour chaque ensemble de données regroupées. Voici un exemple de table, ProductInteractions.

+---------+------------+----------------+------------+
| User ID | Product ID | Date d'achat  | Occurrence |
+---------+------------+----------------+------------+
| user15  | b1290      | 1/1/2012       |          1 |
| user15  | b1290      | 1/15/2013      |          2 |
| user15  | b1290      | 3/15/2019      |          3 |
| user15  | a7983      | 7/22/2017      |          1 |
| user2   | a7983      | 12/3/2015      |          1 |
| user2   | a7983      | 5/6/2016       |          2 |
| user3   | a7983      | 3/24/2017      |          1 |
+---------+------------+----------------+------------+

Données originales :

+---------+------------+-----------+
| User ID | Product ID |   Date    |
+---------+------------+-----------+
| user15  | b1290      | 1/1/2012  |
| user2   | a7983      | 5/6/2016  |
| user15  | b1290      | 3/15/2019 |
| user15  | a7983      | 7/22/2017 |
| user2   | a7983      | 12/3/2015 |
| user15  | b1290      | 1/15/2013 |
| user3   | a7983      | 3/24/2017 |
+---------+------------+-----------+

Remarque : dans l'exemple ci-dessus, user15 et le produit b1290 ont 3 interactions. Il est important que la première occurrence soit liée à la date d'interaction initiale et que les interactions ultérieures soient comptées par date croissante.

Je pense que le format de base de la requête sera le suivant :

    SELECT [User ID],
           [Product ID],
           [Date d'achat]
           -- Quelque chose ici utilisant IDENTITY, peut-être ?
      FROM ProductInteractions
     GROUP BY [User ID],
              [Product ID];

4voto

Kemal AL GAZZAH Points 756

Utiliser ROW_NUMBER()

Voici le code pour tester/valider le script ci-dessous : remplacez ProductInteractions par votre propre table

déclarer @ProductInteractions comme table([ID Utilisateur] varchar(50),[ID Produit] varchar(50),[Date] datetime)
insérer dans @ProductInteractions valeurs
('user15'  , 'b1290'      , '1/1/2012'  ),
('user2'   , 'a7983'      , '5/6/2016'  ),
('user15'  , 'b1290'      , '3/15/2019' ),
('user15'  , 'a7983'      , '7/22/2017' ),
('user2'   , 'a7983'      , '12/3/2015' ),
('user15'  , 'b1290'      , '1/15/2013' ),
('user3'   , 'a7983'      , '3/24/2017' )

sélectionner [ID Utilisateur],[ID Produit],[Date],
numéro_de_ligne() over(partition by [ID Utilisateur],[ID Produit] order by [date]) [occurrence]
de @ProductInteractions order by [ID Produit] desc

entrer la description de l'image ici

3voto

Sean Lange Points 23698

Un simple ROW_NUMBER est parfait pour cela.

SELECT [User ID],
    [Product ID],
    [Date Purchased]
    , ROW_NUMBER() over(partition by [User ID], [Product ID] order by [Date Purchased])
FROM ProductInteractions
GROUP BY [User ID],
        [Product ID];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X