2017-07-27 75 views
-1

我司已經反映了緩存的命中率,從形式的表列:SQL:添加這是每一個細胞

Action | logic name | count 
PUSH  a   123 
HIT  a   57 
PUSH  b   321 
HIT  b   77 
PUSH  c   111 
HIT  c   50 

的命中率是57/123,的b爲321分之77。

動作列具有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 
+1

您已標記2分貝,'mysql'和'sql-server'和第二個與確切的版本,看起來像你使用'sql-server'。所以,可能你需要刪除'mysql'標籤? –

回答

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; 
+0

什麼'a'代表? –

+0

@AndreyIsakov更新了答案。 'a'是表'hit_rate'的別名 –

+0

@DarshanMehta'hit_rate'不是表。 :)別名'a'應該在'table'和';'之間。 – Rokuto

0

我想用PIVOT來解決這個問題。即使您的每個logic_name有多於2個的HIT-PUSH行,該解決方案也可以更靈活。我們的想法是代表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 
2

如果每邏輯名稱動作恰好有1行和行動的只有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