问题描述
|
我有这张桌子:
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最高的资产。