Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用内部联接选择多个最大值_Sql_Sql Server - Fatal编程技术网

Sql 使用内部联接选择多个最大值

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.

只有当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.[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
。使用
不同的
将只返回一行。现在,如果您想将min
a.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
。使用
不同的
将只返回一行。现在,如果您想将min
a.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,这应该可以满足您的需求。