À titre d'exemple simplifié, je dois sélectionner chaque instance dans laquelle un client avait une adresse de livraison différente de son adresse de livraison précédente. J'ai donc une grande table avec des colonnes telles que:SQL: classer par, puis sélectionner la première ligne avec une valeur distincte pour plusieurs colonnes
purchase_id | cust_id | date | address | description
-----------------------------------------------------------
1 | 5 | jan | address1 | desc1
2 | 6 | jan | address2 | desc2
3 | 5 | feb | address1 | desc3
4 | 6 | feb | address2 | desc4
5 | 5 | mar | address3 | desc5
6 | 5 | mar | address3 | desc6
7 | 5 | apr | address1 | desc7
8 | 6 | may | address4 | desc8
Notez que les clients peuvent « retourner » vers une adresse précédente en tant que client 5 fait dans la ligne 7.
Ce que je veux choisir (et le plus efficacement possible car il s'agit d'une table assez grande) est la première rangée de chaque «bloc» dans lequel un client avait des commandes ultérieures expédiées à la même adresse. Dans cet exemple, ce sont les lignes 1,2,5,7 et 8. Dans tous les autres, le client a la même adresse que sa précédente commande. Donc, je veux d'abord ORDER BY (cust_id, date)
, puis SELECT purchase_id, cust_id, min(date), address, description
.
Cependant, je rencontre des problèmes parce que SQL nécessite habituellement GROUP BY
avant le ORDER BY
. Je ne peux donc pas comprendre comment adapter, par ex. l'une des meilleures réponses à this question (ce que j'apprécie). Il est nécessaire (conceptuellement, au moins) de classer par date avant de regrouper ou d'utiliser des fonctions agrégées comme min()
, sinon des instances comme la ligne 7 dans ma table d'exemple me manqueraient, où un client a «reculé» à une adresse antérieure.
Notez également que deux clients peuvent partager une adresse, donc je dois regrouper efficacement à la fois par cust_id
et address
après la commande par date.
J'utilise flocon de neige que je crois a la plupart des mêmes commandes disponibles que les versions de PostgreSQL et SQL Server (bien que je suis assez nouveau pour flocon de neige donc pas complètement sûr.)
Voulez-vous pour revenir achats pour les clients avec plus d'une adresse? –
Peut être 1,2,5,8 au lieu de 1,2,7,8? –
Anthony E: Non, je veux retourner (au moins) 1 ligne pour tous les clients qui ont déjà eu une adresse, et plus de lignes pour les clients qui ont changé d'adresse une ou plusieurs fois. Giorgi Nakeuri: Merci, devrait être 1,2,5,7, et 8. (Les lignes 5 et 7 ont toutes les deux une adresse différente de celle utilisée par le client). – DNB