2
votes

Comment puis-je obtenir des données distinctes d'une même colonne

J'ai besoin d'obtenir les données personnelles de tous nos membres dont les abonnements sont expirés, c'est-à-dire dont la date de fin d'abonnement est antérieure au 31/03/2020, mais je souhaite afficher un seul enregistrement de membre (distinct par numéro de membre) idéalement le plus récent un

J'ai essayé une solution ROW_NUMBER () SQL - Distinct One Col , Sélectionnez plusieurs autres? et une solution d'application croisée sql distinct, obtenant 2 colonnes a> mais je n'arrive pas à le faire fonctionner.

1   2011-04-01 00:00:00.000
2   2018-04-01 00:00:00.000

Le résultat est

Id  Enddate
1   2006-04-01 00:00:00.000
1   2001-04-01 00:00:00.000
1   1999-04-01 00:00:00.000
1   1998-04-01 00:00:00.000
1   2008-04-01 00:00:00.000
1   2007-04-01 00:00:00.000
1   2011-04-01 00:00:00.000
1   2005-04-01 00:00:00.000
1   2000-04-01 00:00:00.000
1   1997-04-01 00:00:00.000
2   1999-04-01 00:00:00.000
2   2012-04-01 00:00:00.000
2   2004-04-01 00:00:00.000
2   2001-04-01 00:00:00.000
2   2018-04-01 00:00:00.000
2   2009-04-01 00:00:00.000
2   2005-04-01 00:00:00.000
2   1997-04-01 00:00:00.000

Le résultat souhaité

Date de fin de l'identifiant

SELECT membershipnumber AS Id, 
       subscription.enddate 
FROM   [dbo].[userprofile] 
       INNER JOIN dbo.subscription 
               ON userprofile.id = subscription.userprofileid 
       INNER JOIN dbo.subscriptiontype 
               ON subscriptiontype.id = subscription.subscriptiontypeid 


6 commentaires

quelle sortie vous obtenez de la requête ci-dessus et votre sortie attendue.


Simplifiez-vous la tâche: exemple reproductible minimal


Quel SGBD utilisez-vous? "SQL" n'est qu'un langage de requête, pas le nom d'un produit de base de données spécifique. Veuillez ajouter une balise pour le produit de base de données que vous utilisez


Copie possible de SELECT DISTINCT sur une colonne


Je ne vois aucun ROW_NUMBER () dans votre requête. Quel code avez-vous essayé exactement?


Vous dites que vous voulez un enregistrement "membre", mais aucune de vos tables ne s'appelle "membre". Je ne sais pas ce que vous voulez.


4 Réponses :


0
votes

Je ne sais pas si j'ai bien répondu à votre question.

mais vous pouvez utiliser DISTINCT dans SELECT, qui n'afficherait qu'un seul enregistrement pour chaque membre.

SELECT DISTINCT Membershipnumber as Id
,'P' as PartyType
,'A' as Status
,case
when Name = 'Standard Membership paid annually.' and EndDate > '2020-03-31' then 'Member'
when Name = 'Lapsed subscription renewal' and EndDate > '2020-03-31' then 'Member'
when Name = '3 Year Subscription (members outside of UK and Ireland, Jersey, Guernsey and the Channel Islands)' and EndDate > '2020-03-31' then 'Overseas member'
when Name = '1 Year Subscription (members outside of UK and Ireland, Jersey, Guernsey and the Channel Islands).' and EndDate > '2020-03-31' then 'Overseas member'
when Name = 'Lapsed subscription renewal' and EndDate > '2020-03-31' then 'Member'
when Name = 'Lifetime membership' then 'Lifetime member'
when Name = 'Retired membership paid annually' and EndDate > '2020-03-31' then 'Retired member'
else 'Non member'
end As MemberType
,Title as NamePrefix
,FirstName as FirstName
,Surname as LastName
,DateOfBirth as BirthDate
,'Home' as AddressPurpose
,'Default' as CommunicationReasons
,AddressLine1
,AddressLine2
,AddressLine3
,Addressline4 as CityName
,'' as CountrySubEntityName
,Country as CountryCode
,'' as CountryName
,Postcode as PostalCode
,EmailAddress as Email
FROM [dbo].[UserProfile]
  inner join dbo.Subscription on
  UserProfile.Id = Subscription.UserProfileId
  inner join dbo.SubscriptionType on
  SubscriptionType.id = Subscription.SubscriptionTypeId```


0 commentaires

0
votes

Si vous obtenez la sortie mentionnée ci-dessus. Ensuite, à partir de là, la sortie souhaitée sera facilement obtenue en utilisant distinct.

  ; with cte as (
     ----- query which gives you above mentioned output
  )
   select distinct id, max(Enddate) as Enddate from cte 


0 commentaires

0
votes

Je pense que vous voulez quelque chose comme ceci:

select *
from (select . . ., -- all the columns you want
             row_number() over (partition by Membershipnumber as Id order by s.Enddate) as seqnum
      from [dbo].[UserProfile] up inner join
           dbo.Subscription s
           on up.Id = s.UserProfileId inner join
           dbo.SubscriptionType st
           on st.id = s.SubscriptionTypeId
     ) x
where  seqnum = 1;


0 commentaires

1
votes

Réponse sql résolue

;WITH cte 
     AS (SELECT membershipnumber                        AS Id, 
                subscription.enddate, 
                Row_number() 
                  OVER ( 
                    partition BY membershipnumber 
                    ORDER BY subscription.enddate DESC) AS rownumber 
         FROM   [dbo].[userprofile] 
                INNER JOIN dbo.subscription 
                        ON userprofile.id = subscription.userprofileid 
                INNER JOIN dbo.subscriptiontype 
                        ON subscriptiontype.id = subscription.subscriptiontypeid 
        ) 
SELECT * 
FROM   cte 
WHERE  rownumber = 1 

https://stackoverflow.com/a/6841644/5859743


0 commentaires