Выбор нескольких значений MAX с использованием внутреннего объединения - PullRequest
1 голос
/ 31 августа 2009

У меня есть запрос, который работает для меня, только когда значения в StakeValue не повторяются. По сути, мне нужно выбрать максимальные значения из таблицы SI_STAKES с их отношениями из двух других таблиц, сгруппированных по внутреннему типу.

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

Спасибо за вашу помощь

Ответы [ 2 ]

2 голосов
/ 31 августа 2009

Здесь нужно решить две проблемы.

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) Тогда нам нужно получить только одно возвращение для этого значения, поскольку оно может присутствовать более одного раза.

Используя Макс. Значение, мы должны найти уникальную строку для каждого, что я обычно делаю, получая Макс. ИД, что дает мне дополнительное преимущество:

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) Теперь, когда у нас есть идентификаторы нужных нам строк, мы можем просто получить эту информацию.

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 
        )
2 голосов
/ 31 августа 2009

Вы можете использовать предложение over, поскольку вы используете T-SQL (возможно, 2005 +):

select distinct
    a.stakevalue,
    max(a.stakevalue) over (partition by a.staketypeid) 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

По сути, это найдет максимум a.stakevalue для каждого a.staketypeid. Использование distinct вернет одну и только одну строку. Теперь, если вы хотите включить мин a.id вместе с ним, вы можете использовать row_number для этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...