2

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 
4

2 に答える 2

2
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

ノート:

  • 式を float の結果に変換するために 1.0 が追加されます
  • Count(ir.ItemId) は NULLS をスキップするため、関係があるものだけをカウントします

ItemstoItemsRelationsが 1 対多の場合、DISTINCT が必要になる場合があります

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
于 2012-02-17T11:05:20.737 に答える
0

これでうまくいくはずだと思います:

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
于 2012-02-17T11:02:09.387 に答える