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
4 Réponses :
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```
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
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;
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
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.