选择用于GROUP BY的行

时间:2011-06-13 14:59:39

标签: sql database

我有这张桌子:

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

以最佳价格获得指定所有者的资产交叉。

我还需要用于max(rate)的行的id,但我找不到将它包含到SELECT的方法。有什么想法吗?

修改

我需要

  • 查找属于两个所有者(1和2)的所有资产
  • 从同一资产中我只需要一个最优惠率(3)
  • 我还需要属于具有最佳费率的特定资产的其他列(所有者)

我期待以下输出:

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

哎呀,所有3,但基本上我需要第3行的id来再次查询同一个表,因此结果输出(在第二次查询之后)将是:

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

让我们说它是Postgres,但我更喜欢合理的跨DBMS解决方案。

编辑2:

伙计们,我知道如何使用JOIN来做到这一点。很抱歉有误导性问题,但我需要知道如何从现有查询中获取额外费用。我已经选择了所需的资产和费率,我只需要一个额外的字段,其中包括max(rate)和给定条件(如果可能的话)。

5 个答案:

答案 0 :(得分:1)

另一种解决方案可能会或可能不会比自连接更快(取决于DBMS的优化器)

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

答案 1 :(得分:0)

首先搜索每个资产的最高费率的行。然后它获取每个资产的最高ID,并选择:

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

如果多个资源共享最高费率,则会显示ID最高的那个。

答案 2 :(得分:0)

你正在处理两个问题并试图解决它们,就像它们是一个一样。使用子查询,您可以通过首先按正确的顺序(最大(费率))过滤列表来更好地进行优化,但是一旦分组,您就会失去这个。因此,我会设置两个查询(相同的过程,如果您正在使用过程,但两个查询)并分别提出问题。除非......输出时需要在单个网格中提供一些信息。

我想更好的方向是让你展示你想要的输出效果。一旦你烘烤输入和输出,奥利奥的中间就更容易填充。

答案 3 :(得分:0)

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 

答案 4 :(得分:0)

您没有指定正在运行的数据库类型,但如果您有可用的分析功能,则可以执行以下操作:

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”。