SQL:添加列,它是每个单元格

时间:2017-07-27 07:31:58

标签: sql sql-server sql-server-2008

我有一个表格,它反映了缓存命中率,格式为:

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

3 个答案:

答案 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只有HITPUSH,那么您可以使用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行,此解决方案也会更加灵活。我们的想法是将HITRATE表示为每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