计算比率的sql查询优化
Posted
技术标签:
【中文标题】计算比率的sql查询优化【英文标题】:Sql query optimization for calculating ratio 【发布时间】:2012-02-17 10:57:22 【问题描述】:我有 2 个表(它只是此查询所需的表列的一部分):
Items: Id int, OwnerId int
ItemsRelations: RelationId int, ItemId Int (FK Items(Id))
对于每个 OwnerId,我需要计算比率函数的结果: 链接到 ItemsRelationstable 的用户元素计数/所有用户元素的计数。
我写了这个查询,但它很慢而且不是最优的。有没有更简单快捷的方法来做到这一点?
SELECT OwnerId , (100 * SUM(HasRelation))/COUNT(Id) AS Ratio
FROM (
SELECT
oi.OwnerId,
oi.Id,
(CASE WHEN SUM(ir.Id) > 0 THEN 1 ELSE 0 END) HasRelation
FROM Items AS oi
LEFT JOIN ItemsRelations AS ir ON ir.ItemId = oi.Id
GROUP BY oi.Id, oi.OwnerId) tempTab
GROUP BY OwnerId
【问题讨论】:
【参考方案1】:SELECT oi.OwnerId, Ratio = 1.0 * Count(ir.ItemId) / Count(*)
FROM Items AS oi
LEFT JOIN ItemsRelations AS ir ON ir.ItemId = oi.Id
GROUP BY oi.OwnerId
注意事项:
添加了1.0,将表达式转换为float结果 Count(ir.ItemId) 跳过 NULLS,因此它只计算那些有关系的人如果Items
到ItemsRelations
是一对多,那么您可能需要区分它
SELECT oi.OwnerId, Ratio = 1.0 * Count(DISTINCT ir.ItemId) / Count(DISTINCT oi.Id)
FROM Items AS oi
LEFT JOIN ItemsRelations AS ir ON ir.ItemId = oi.Id
GROUP BY oi.OwnerId
【讨论】:
Aaaa .. 我创建了第一个版本,但结果是错误的答案,所以我制作了这个嵌套版本。但 DISTINCT 就像一个魅力。我不知道我可以在那里使用它。谢谢。【参考方案2】:我认为这应该可以解决问题:
select i.OwnerId,
case when count(i.Id) > 0 then count(r.Id)/count(i.Id) else 0 end as Ratio
from Items i
left join ItemsRelations r on r.ItemId = i.Id
group by i.Id, i.OwnerId
【讨论】:
以上是关于计算比率的sql查询优化的主要内容,如果未能解决你的问题,请参考以下文章