首页 > 解决方案 > 如何使用子查询来选择最大值?

问题描述

数据库

我正在尝试构建一个困难的 SQL Server 查询来选择特定数据。首先,让我给你一些背景信息......

我正在使用一个数据库,我需要在其中使用此查询访问 3 个表。您可以在图片中看到图表。如您所见,此数据库中有用户。这些用户可以购买订阅以使用城市周围的一些公共自行车。订阅具有订阅类型。此订阅类型声明订阅的有效期。这可以是一天、一个月或一年。一个用户可以有多个订阅。

通过我的查询,我需要选择用户 ID、名称、由街道、号码、邮政编码、城市和国家/地区代码组成的地址,以及订阅类型的描述。对于每个用户,我只需要持续时间最长的订阅。所以你必须过滤subscriptionTypeId DESC 上的查询。但不仅如此……一个用户可以拥有多个相同类型的订阅,所以我只需要最新的一个。这意味着我还必须在订阅类型中最长的 ValidFrom DESC 上进行过滤。

我知道我需要为此使用子查询,但似乎找不到合适的查询......这是我走了多远,但我一直在使用多种技术来尝试获得我需要的东西:

SELECT 
    su.userId, u.name, u.street, u.number, u.zipcode, u.CountryCode, st.description, 
    MAX(su.validFrom) AS MaxValidFrom, 
    (SELECT MAX(SubscriptionTypeId) FROM dbo.Subscriptions 
     WHERE UserId = su.UserId) AS MaxSubscriptionTypeId
FROM 
    dbo.Users u 
INNER JOIN 
    dbo.Subscriptions su ON u.userId = su.userId
INNER JOIN 
    dbo.SubscriptionTypes st ON su.subscriptionTypeId = st.subscriptionTypeId
HAVING 
    su.SubscriptionTypeId = MAX(su.SubscriptionTypeId)
ORDER BY 
    su.UserId, MaxValidFrom DESC;

提前感谢您帮助我!

净连

标签: sql-serverselectsubquerymax

解决方案


乔伦,

尝试像这样的缩放器函数调用

CREATE FUNCTION MaxSubscriptionTypeID

(   @UserId int ) RETURNS int AS BEGIN  DECLARE @ID int     SELECT @ID = MAX(SubscriptionTypeId) FROM dbo.Subscriptions 
     WHERE UserId = @UserID     -- Return the result of the function    RETURN idnull(@ID,0)

END GO

SELECT 
    su.userId, u.name, u.street, u.number, u.zipcode, u.CountryCode, st.description, 
    MAX(su.validFrom) AS MaxValidFrom, 
    dbo.MaxSubscriptionTypeID( su.UserId) AS MaxSubscriptionTypeId FROM 
    dbo.Users u  INNER JOIN 
    dbo.Subscriptions su ON u.userId = su.userId INNER JOIN 
    dbo.SubscriptionTypes st ON su.subscriptionTypeId = st.subscriptionTypeId HAVING 
    su.SubscriptionTypeId = MAX(su.SubscriptionTypeId) ORDER BY 
    su.UserId, MaxValidFrom DESC;

推荐阅读