2013-08-23 66 views
0

我有一個基於幾個子查詢計算值的查詢。子查詢基於特定的時間戳。我想爲許多不同時間戳的記錄計算此值。我無法弄清楚如何去做。MySql:基於多個子查詢計算值

的基本公式是(S11S4CreateSessionReqRcvd - S11S4CreateSessionRespAccSent)* 100/S11S4CreateSessionRespAccSent

SELECT 
((((select ref_data FROM test.sgw_S5S11 where timestamp = "2013-08-21 00:00:06" and ref_type = "S11S4CreateSessionReqRcvd") - (select ref_data FROM test.sgw_S5S11 
where timestamp = "2013-08-21 00:00:06" and ref_type = "S11S4CreateSessionRespAccSent")) * 100)/(select ref_data FROM test.sgw_S5S11 
where timestamp = "2013-08-21 00:00:06" and ref_type = "S11S4CreateSessionReqRcvd")) as MyCalc 

我不知道如何在一個表中,以便粘貼到這裏是我的數據的CSV格式的樣品

這裏的我的數據樣本。 (我不知道如何把一個表在這裏,所以它在CSV格式)

的myKey,時間戳,ref_type,ref_data 1016101 「2013年8月21日00:00:06」,S5S8CreateSessionReqSent,128042907 1016102,「2013-08-21 00:00:06」,S5S8CreateSessionRespAccRcvd,127088838 1016103,「2013-08-21 00:00:06」,S5S8CreateSessionRespRejRcvd,615553 1016104,「2013-08-21 00:00:06」 ,S5S8CreateBearerReqRcvd,10047 1016105,「2013-08-21 00:00:06」,S5S8CreateBearerRespAccSent,9932 1016106,「2013-08-21 00:00:06」,S5S8CreateBearerRespRejSent,103 1016107,「2013-08-21 00: 00:06「,S11S4CreateSessionReqRcvd,128255390 1016108,」2013-08-21 00:00:06「,S11S4CreateSessionRespAccSent,127114539 1016109,」2013-08-21 00:00:06「,S11S4CreateSessionRespRejSent,713325 1016110,」2013-08 -21 00:00:06「,S11S4CreateBearerReqSent,10028 1016111,」2013-08-21 00:00:06「,S11S4CreateBearerRespAccRcvd,9932 1016112,」2 「013-08-21 00:00:06」,S11S4CreateBearerRespRejRcvd,42

任何幫助將不勝感激!

回答

1

此查詢很尷尬,因爲您已將屬性存儲在單獨的行上。這種設計被稱爲Entity-Attribute-Value,對於關係數據庫來說這通常是一個壞主意。

下面的查詢可能會有點更高效,更容易編寫:

SELECT (eav.ReqRcvd - eav.AccSent) * 100/eav.AccSent AS MyCalc 
FROM (
    SELECT timestamp, 
    MAX(IF(ref_type='S11S4CreateSessionReqRcvd', ref_data)) AS ReqRcvd, 
    MAX(IF(ref_type='S11S4CreateSessionRespAccSent', ref_data)) AS AccSent 
    FROM test.sgw_S5S11 
    WHERE timestamp = '2013-08-21 00:00:06' 
    GROUP BY timestamp 
) AS eav; 

PS:使用單引號'字符串和日期文字,而不是雙引號"。在標準SQL中,雙引號用於分隔表和列標識符。 MySQL將兩種類型的引號默認處理爲相同,但這受SQL_MODE限制,如果您使用其他品牌的RDBMS,也不會採用相同的方式。因此,養成以標準方式使用引號的習慣是一件好事。

+0

Thanks @BillKarwin。您的回答讓我獲得了比我更多的信息,但是當我擴展時間戳以允許更多時間戳時,它會一直給出每個ref_type中所有可用的最大值。爲了讓他工作,我必須將MAX(IF(ref_type ='S11S4CreateSessionReqRcvd',ref_data))更改爲MAX(IF(ref_type ='S11S4CreateSessionReqRcvd',ref_data,0)),因爲什麼是由group by statement是最後一次迭代,它不是正確的ref_type。我想我只是將所有這些都放到perl腳本中,並且這樣做,但是我想要感謝你。 – user2712370

+0

我從使用你的方法中學到了很多東西,儘管它沒有讓我找到我想要的東西。再次感謝!!! – user2712370