sql-server - 如何使用子查询来选择最大值?
问题描述
我正在尝试构建一个困难的 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;
提前感谢您帮助我!
净连
解决方案
乔伦,
尝试像这样的缩放器函数调用
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;
推荐阅读
- apache-spark - 从一个表中查找数组值到另一个表并准备映射、键和值
- kubernetes-helm - 如何控制伞形图中 helm 子图的安装顺序
- pdftron - 如何在 XamarinForms Pdftron 中使用 ToolManagerBuilder 设置 ToolManager 只读模式
- javascript - Flatlist、React Native 的扁平化数组
- c++ - 在 FreeBSD 中,clang 找不到标准 c++ 库头文件
- python - 如何永久设置 LD_LIBRARY_PATH
- sass - Svelte Materialify 库不加载主题样式
- c++ - 非常量复制构造函数可以用 C++17 编译
- python - Python QRCODE 保存到文件夹
- reactjs - 反应静态文件不在html内呈现