Sql 使用内部联接选择多个最大值
只有当StakeValue中的值不重复时,我的查询才有效。 基本上,我需要从SI_Stacks表中选择最大值,并从其他两个按内部类型分组的表中选择它们之间的关系Sql 使用内部联接选择多个最大值,sql,sql-server,Sql,Sql Server,只有当StakeValue中的值不重复时,我的查询才有效。 基本上,我需要从SI_Stacks表中选择最大值,并从其他两个按内部类型分组的表中选择它们之间的关系 SELECT a.StakeValue, b.[StakeName], c.[ProviderName] FROM SI_STAKES AS a INNER JOIN SI_STAKESTYPES AS b ON a.[StakeTypeID] = b.[ID] INNER JOIN SI_PROVIDERS AS c ON a.
SELECT a.StakeValue, b.[StakeName], c.[ProviderName]
FROM SI_STAKES AS a
INNER JOIN SI_STAKESTYPES AS b ON a.[StakeTypeID] = b.[ID]
INNER JOIN SI_PROVIDERS AS c ON a.[ProviderID] = c.[ID] WHERE a.[EventID]=6
AND a.[StakeGroupTypeID]=1
AND a.StakeValue IN
(SELECT MAX(d.StakeValue) FROM SI_STAKES AS d
WHERE d.[EventID]=a.[EventID] AND d.[StakeGroupTypeID]=a.[StakeGroupTypeID]
GROUP BY d.[StakeTypeID])
ORDER BY b.[StakeName], a.[StakeValue] DESC
例如,结果必须是:
[ID] [MaxValue] [StakeTypeID] [ProviderName]
1 1,5 6 provider1
2 3,75 7 provider2
3 7,6 8 provider3
感谢您的帮助您可以使用该子句,因为您使用的是T-SQL(希望是2005+):
本质上,这将为每个a.stateTypeId
找到最大a.stateValue
。使用不同的
将只返回一行。现在,如果您想将mina.id
与之一起包含,您可以使用来完成此操作:
select
s.id,
s.maxvalue,
s.staketypeid,
s.providername
from (
select
row_number() over (order by a.stakevalue desc
partition by a.staketypeid) as rownum,
a.id,
a.stakevalue as maxvalue,
b.staketypeid,
c.providername
from
si_stakes a
inner join si_stakestypes b on
a.staketypeid = b.id
inner join si_providers c on
a.providerid = c.id
where
a.eventid = 6
and a.stakegrouptypeid = 1
) s
where
s.rownum = 1
您可以使用该子句,因为您使用的是T-SQL(希望是2005+):
本质上,这将为每个a.stateTypeId
找到最大a.stateValue
。使用不同的
将只返回一行。现在,如果您想将mina.id
与之一起包含,您可以使用来完成此操作:
select
s.id,
s.maxvalue,
s.staketypeid,
s.providername
from (
select
row_number() over (order by a.stakevalue desc
partition by a.staketypeid) as rownum,
a.id,
a.stakevalue as maxvalue,
b.staketypeid,
c.providername
from
si_stakes a
inner join si_stakestypes b on
a.staketypeid = b.id
inner join si_providers c on
a.providerid = c.id
where
a.eventid = 6
and a.stakegrouptypeid = 1
) s
where
s.rownum = 1
这里有两个问题需要解决 1) 查找每种类型的最大值。这将获得每个StakeType的最大值,并确保我们只针对想要的事件和组类型进行练习
SELECT StakeGroupTypeID, EventID, StakeTypeID, MAX(StakeValue) AS MaxStakeValue
FROM SI_STAKES
WHERE Stake.[EventID]=6
AND Stake.[StakeGroupTypeID]=1
GROUP BY StakeGroupTypeID, EventID, StakeTypeID
2) 然后,我们只需要为该值返回一次,因为它可能会出现多次
使用最大值,我们必须为每一行找到一个唯一的行。我通常通过获取最大ID来实现这一点。它还有一个额外的优点,就是获取最新的条目
SELECT MAX(SMaxID.ID) AS ID
FROM SI_STAKES AS SMaxID
INNER JOIN (
SELECT StakeGroupTypeID, EventID, StakeTypeID, MAX(StakeValue) AS MaxStakeValue
FROM SI_STAKES
WHERE Stake.[EventID]=6
AND Stake.[StakeGroupTypeID]=1
GROUP BY StakeGroupTypeID, EventID, StakeTypeID
) AS SMaxVal ON SMaxID.StakeTypeID = SMaxVal.StakeTypeID
AND SMaxID.StakeValue = SMaxVal.MaxStakeValue
AND SMaxID.EventID = SMaxVal.EventID
AND SMaxID.StakeGroupTypeID = SMaxVal.StakeGroupTypeID
3) 现在我们有了所需行的ID,我们就可以得到这些信息了
SELECT Stakes.ID, Stakes.StakeValue, SType.StakeName, SProv.ProviderName
FROM SI_STAKES AS Stakes
INNER JOIN SI_STAKESTYPES AS SType ON Stake.[StakeTypeID] = SType.[ID]
INNER JOIN SI_PROVIDERS AS SProv ON Stake.[ProviderID] = SProv.[ID]
WHERE Stake.ID IN (
SELECT MAX(SMaxID.ID) AS ID
FROM SI_STAKES AS SMaxID
INNER JOIN (
SELECT StakeGroupTypeID, EventID, StakeTypeID, MAX(StakeValue) AS MaxStakeValue
FROM SI_STAKES
WHERE Stake.[EventID]=6
AND Stake.[StakeGroupTypeID]=1
GROUP BY StakeGroupTypeID, EventID, StakeTypeID
) AS SMaxVal ON SMaxID.StakeTypeID = SMaxVal.StakeTypeID
AND SMaxID.StakeValue = SMaxVal.MaxStakeValue
AND SMaxID.EventID = SMaxVal.EventID
AND SMaxID.StakeGroupTypeID = SMaxVal.StakeGroupTypeID
)
这里有两个问题需要解决 1) 查找每种类型的最大值。这将获得每个StakeType的最大值,并确保我们只针对想要的事件和组类型进行练习
SELECT StakeGroupTypeID, EventID, StakeTypeID, MAX(StakeValue) AS MaxStakeValue
FROM SI_STAKES
WHERE Stake.[EventID]=6
AND Stake.[StakeGroupTypeID]=1
GROUP BY StakeGroupTypeID, EventID, StakeTypeID
2) 然后,我们只需要为该值返回一次,因为它可能会出现多次
使用最大值,我们必须为每一行找到一个唯一的行。我通常通过获取最大ID来实现这一点。它还有一个额外的优点,就是获取最新的条目
SELECT MAX(SMaxID.ID) AS ID
FROM SI_STAKES AS SMaxID
INNER JOIN (
SELECT StakeGroupTypeID, EventID, StakeTypeID, MAX(StakeValue) AS MaxStakeValue
FROM SI_STAKES
WHERE Stake.[EventID]=6
AND Stake.[StakeGroupTypeID]=1
GROUP BY StakeGroupTypeID, EventID, StakeTypeID
) AS SMaxVal ON SMaxID.StakeTypeID = SMaxVal.StakeTypeID
AND SMaxID.StakeValue = SMaxVal.MaxStakeValue
AND SMaxID.EventID = SMaxVal.EventID
AND SMaxID.StakeGroupTypeID = SMaxVal.StakeGroupTypeID
3) 现在我们有了所需行的ID,我们就可以得到这些信息了
SELECT Stakes.ID, Stakes.StakeValue, SType.StakeName, SProv.ProviderName
FROM SI_STAKES AS Stakes
INNER JOIN SI_STAKESTYPES AS SType ON Stake.[StakeTypeID] = SType.[ID]
INNER JOIN SI_PROVIDERS AS SProv ON Stake.[ProviderID] = SProv.[ID]
WHERE Stake.ID IN (
SELECT MAX(SMaxID.ID) AS ID
FROM SI_STAKES AS SMaxID
INNER JOIN (
SELECT StakeGroupTypeID, EventID, StakeTypeID, MAX(StakeValue) AS MaxStakeValue
FROM SI_STAKES
WHERE Stake.[EventID]=6
AND Stake.[StakeGroupTypeID]=1
GROUP BY StakeGroupTypeID, EventID, StakeTypeID
) AS SMaxVal ON SMaxID.StakeTypeID = SMaxVal.StakeTypeID
AND SMaxID.StakeValue = SMaxVal.MaxStakeValue
AND SMaxID.EventID = SMaxVal.EventID
AND SMaxID.StakeGroupTypeID = SMaxVal.StakeGroupTypeID
)
我看到两个SQL查询根本没有格式化。你想干什么?我只是不停地放松阵型。。。我不知道为什么。。第一次是错误的保存抱歉。是的,这是可行的,但与我自己的解决方案有相同的问题-如果[StakeValue]列中存在相同的值,则此查询返回所有数据。我看到两个SQL查询根本没有格式化。你想干什么?我只是不停地放松阵型。。。我不知道为什么。。第一次是错误的保存抱歉。是的,这是可行的,但与我自己的解决方案有相同的问题-如果[StakeValue]列中存在相同的值,此查询将返回所有数据。谢谢您的回答。你的解决方案对我来说不是我所期望的。此查询返回符合条件的所有行。当我只需要最多3个分组的类型。当我从SELECT语句中删除c.[providername]列时,这会起作用,但我还需要结果中的providername列值。嗯……如果有多个提供程序,您想要哪一个?我只需要为结果中包含的值选择相应的提供程序名。要知道是什么提供商提供了该股份的价值。Thanks@Alex:通过
stakevalue
更改为order,这将满足您的需求。谢谢您的回答。你的解决方案对我来说不是我所期望的。此查询返回符合条件的所有行。当我只需要最多3个分组的类型。当我从SELECT语句中删除c.[providername]列时,这会起作用,但我还需要结果中的providername列值。嗯……如果有多个提供程序,您想要哪一个?我只需要为结果中包含的值选择相应的提供程序名。要知道是什么提供商提供了该股份的价值。Thanks@Alex:通过stakevalue
更改为order,这应该可以满足您的需求。