Выберите строку, используемую для GROUP BY - PullRequest
0 голосов
/ 13 июня 2011

У меня есть эта таблица:

id | owner | asset | rate
-------------------------
1  | 1     | 3     | 1
2  | 1     | 4     | 2
3  | 2     | 3     | 3
4  | 2     | 5     | 4

И я использую

SELECT asset, max(rate)
FROM test 
WHERE owner IN (1, 2)
GROUP BY asset
HAVING count(asset) > 1
ORDER BY max(rate) DESC

, чтобы получить пересечение активов для указанных владельцев с лучшим коэффициентом.

Iтакже нужен идентификатор строки, используемой для max (rate), но я не могу найти способ включить его в SELECT.Есть идеи?

Редактировать:

Мне нужно

  • Найти все активы, принадлежащие обоим владельцам (1 и 2)
  • Из того же актива мне нужен только один с лучшей ставкой (3)
  • Мне также нужны другие столбцы (владелец), которые принадлежат конкретному активу с лучшей ставкой

Я ожидаю следующий вывод:

id | asset | rate
-------------------------
3  | 3     | 3

Упс, все 3 с, но в основном мне нужен идентификатор 3-й строки для повторного запроса к той же таблице, поэтому результирующий вывод (после второго запроса) будет:

id | owner | asset | rate
-------------------------
3  | 2     | 3     | 3

Допустим, это Postgres, но я бы предпочел разумно кросс-СУБД.

Редактировать 2:

Ребята, я знаю, как это сделатьс участием.Извините за вводящий в заблуждение вопрос, но мне нужно знать, как получить дополнительный из существующего запроса.У меня уже есть необходимые активы и выбранные ставки, мне просто нужно одно дополнительное поле среди с max (rate) и заданными условиями, если это возможно.

Ответы [ 5 ]

1 голос
/ 13 июня 2011

Другое решение, которое может или не может быть быстрее, чем самостоятельное соединение (в зависимости от оптимизатора СУБД)

SELECT id, 
       asset,
       rate,
       asset_count
FROM (
    SELECT id,
           asset, 
           rate,
           rank() over (partition by asset order by rate desc) as rank_rate,
           count(asset) over (partition by null) as asset_count
    FROM test 
    WHERE owner IN (1, 2)
) t
WHERE rank_rate = 1
ORDER BY rate DESC
0 голосов
/ 13 июня 2011

Вы не указываете, какой тип базы данных вы используете, но если у вас есть аналитические функции, вы можете сделать это:

select id, asset, max_rate
from (
   select ID, asset, max(rate) over (partition by asset) max_rate, 
   row_number() over (partition by asset order by rate desc) row_num
   from test
   where owner in (1,2)
) q
where row_num = 1

Я не уверен, как добавить в "имея таким образом счет (актив)> 1 ".

0 голосов
/ 13 июня 2011

Вы имеете дело с двумя вопросами и пытаетесь решить их, как если бы они были одним. С подзапросом вы можете лучше уточнить, сначала отфильтровав список в правильном порядке (max (rate)), но как только вы сгруппируете, вы потеряете это. Таким образом, я бы настроил два запроса (та же процедура, если вы используете процедуры, но два запроса) и задавал вопросы отдельно. Если только ... вам не нужна часть информации в единой сетке при выводе.

Полагаю, лучшее направление для головы - показать, как должен выглядеть вывод. Как только вы запекаете ввод и вывод, середину орео легче заполнить.

0 голосов
/ 13 июня 2011
SELECT b.id, b.asset, b.rate
from
(
SELECT asset, max(rate) maxrate
FROM test  
WHERE owner IN (1, 2) 
GROUP BY asset 
HAVING count(asset) > 1 
) a, test b
WHERE a.asset = b.asset
AND a.maxrate = b.rate
ORDER BY b.rate DESC 
0 голосов
/ 13 июня 2011

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

select  *
from    test
inner join
        (
        select  max(id) as MaxIdWithMaxRate
        from    test
        inner join
                (
                select  asset
                ,       max(rate) as MaxRate
                from    test 
                group by
                        asset
                ) filter
        on      filter.asset = test.asset
                and filter.MaxRate = test.rate
        group by
                asset
        ) filter2
on      filter.MaxIdWithMaxRate = test.id

Если у нескольких активов максимальная скорость, будет отображаться тот, у которого самый высокий идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...