我有这张桌子:
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的方法。有什么想法吗?
修改
我需要
我期待以下输出:
id | asset | rate
-------------------------
3 | 3 | 3
哎呀,所有3,但基本上我需要第3行的id来再次查询同一个表,因此结果输出(在第二次查询之后)将是:
id | owner | asset | rate
-------------------------
3 | 2 | 3 | 3
让我们说它是Postgres,但我更喜欢合理的跨DBMS解决方案。
编辑2:
伙计们,我知道如何使用JOIN来做到这一点。很抱歉有误导性问题,但我需要知道如何从现有查询中获取额外费用。我已经选择了所需的资产和费率,我只需要一个额外的字段,其中包括max(rate)和给定条件(如果可能的话)。
答案 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”。