选择用于GROUP BY的行

问题描述

| 我有这张桌子:
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,但基本上我需要第三行的ID才能再次查询同一张表,因此(第二次查询后)结果输出为:
id | owner | asset | rate
-------------------------
3  | 2     | 3     | 3
假设它是Postgres,但我更喜欢合理的跨DBMS解决方案。 编辑2: 伙计们,我知道如何用JOIN做到这一点。对不起误导性问题,但我需要知道如何从现有查询获取更多收益。我已经需要选择资产和费率,如果可能的话,我只需要在max(rate)和给定条件中增加一个字段。     

解决方法

        另一个解决方案可能会或可能不会比自我联接更快(取决于DBMS优化程序)
SELECT id,asset,rate,asset_count
FROM (
    SELECT id,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
    ,        您正在处理两个问题,并试图将它们当作一个问题来解决。使用子查询,可以通过首先以适当的顺序(最大(速率))过滤列表来更好地进行优化,但是一旦分组,就会丢失此列表。这样,我将设置两个查询(相同的过程,如果您正在使用过程,但是两个查询),然后分别提出问题。除非...输出时需要在单个网格中提供一些信息。 我想最好的方向是让您展示想要输出的外观。烘焙输入和输出后,奥利奥的中部更容易填充。     ,        
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 
    ,        您无需指定运行的数据库类型,但是如果有可用的分析功能,则可以执行以下操作:
select id,max_rate
from (
   select ID,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”。     ,        这首先搜索具有每个资产最大费率的行。然后,它采用每个资产的最高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最高的资产。