我有一个表格,它反映了缓存命中率,格式为:
Action | logic name | count
PUSH a 123
HIT a 57
PUSH b 321
HIT b 77
PUSH c 111
HIT c 50
a的命中率为57/123,b为77/321。
操作列有2个值: PUSH:指令被推送到缓存而没有被使用 HIT:指令被推送到缓存并被使用
逻辑名称是指决定推送哪条指令的算法名称。计数是推送或命中的指令数量。
我很难找到一种方法来添加另一个列,表明每个算法的命中率。怎么做到呢?
为了说清楚,我希望看到这样的事情:
Action | logic name | count | hit rate %
PUSH a 123 46.3
HIT a 57 46.3
PUSH b 321 23.9
HIT b 77 23.9
PUSH c 111 45.0
HIT c 50 45.0
答案 0 :(得分:2)
如果每个逻辑名称每个操作只有1行,那么您可以编写如下内部查询:
SELECT a.action, a.logic_name, a.count,
((SELECT count FROM table WHERE logic_name = a.logic_name AND action = 'HIT')/
(SELECT count FROM table WHERE logic_name = a.logic_name AND action = 'PUSH'))*100
AS hit_rate
FROM table a;
答案 1 :(得分:2)
如果每个逻辑名称每个操作只有1行,而Action只有HIT
和PUSH
,那么您可以使用min()
(或max()
)窗口分析功能条件,如:
select the_table.*,
min(case when Action = 'HIT' then count end) over(partition by logic_name) /
min(case when Action = 'PUSH' then count end) over(partition by logic_name) * 100 as hit_rate
from the_table
答案 2 :(得分:0)
我会使用PIVOT
来解决这个问题。即使每HIT-PUSH
行有2 logic_name
行,此解决方案也会更加灵活。我们的想法是将HIT
和RATE
表示为每logic_name
列:
DECLARE @t1 TABLE ([action] VARCHAR(50), logic_name VARCHAR(50), [count] INT)
INSERT into @t1 ([action], logic_name, [count]) VALUES
('PUSH','a',123)
,('HIT','a',57)
,('PUSH','b',321)
,('HIT','b',77) ;
WITH cte AS
(
SELECT [logic_name]
,[PUSH]
,[HIT]
,(CAST ([HIT] AS DECIMAL)/[PUSH]) AS HitRate
FROM (
SELECT [action]
,[logic_name]
,[count]
FROM @t1
) AS Source
PIVOT
(
SUM([count])
FOR [action] IN ([PUSH],[HIT])
) AS PivotTable
)
SELECT tt.*,c.HitRate
FROM @t1 tt
JOIN cte c ON c.logic_name = tt.logic_name