2012-06-19 64 views
0

我正在使用MySQL 5.0。MySQL - 加入自己的VIEW

我想根據視圖中的前一行執行計算。這可能嗎?我假設不是因爲查詢在查詢實際運行之前不存在,那麼是否有解決方法,或者是創建和更新表格我最好的選擇?

這是我的編碼不正確,缺乏邏輯,我知道,但它顯示了我想要實現:

CREATE VIEW `Master Facebook Data` tt1 AS SELECT 
    t1.id AS `Client ID`, 
    t1.name AS `Client Name`, 
    t1.`Date`, 
    avg(t1.`Daily People Talking About This`) AS `Avg Daily Talk`, 
    (((tt1.`Avg Daily Talk`-IFNULL(tt2.`Avg Daily Talk`, 0)))/tt1.`Avg Daily Talk`) AS `Change in Talk`, 
    avg(t1.`Weekly Total Reach`) AS `Avg Weekly Reach`, 
    (((tt1.`Avg Weekly Reach`-IFNULL(tt2.`Avg Weekly Reach`, 0)))/tt1.`Avg Weekly Reach`) AS `Change in Reach`, 
    avg(t1.`Daily Viral Reach`) AS `Avg Daily Viral`, 
    (((tt1.`Avg Daily Viral`-IFNULL(tt2.`Avg Daily Viral`, 0)))/tt1.`Avg Daily Viral` AS `Change in Viral` 

FROM `clients` t1 
JOIN `FB Exports - Key Metrics` t2 
ON t1.`id` = t2.`client` 

LEFT OUTER JOIN `Master Facebook Data` tt2 
ON tt1.`Client ID` = tt2.`Client ID` 
AND month(tt1.`Date`)-month(tt2.`Date`)=1 

GROUP BY t2.`client`, month(t2.`Date`) 
ORDER BY t2.`client`, t2.`Date` 

太謝謝你了! =]

回答

0

視圖和表格沒有什麼不同。 SQL理解一個常規視圖是一個如何計算它的配方;因此它可以將它加入到相同或任何其他視圖中,例如它可以將表的複雜聯接連接在一起。

無論哪種方式,都沒有上一行那樣的東西。表和視圖本質上是一組行,而不是有序的行序列。如果在查詢中指定ORDER BY,則強制執行該排序在概念上是最後一次應用的操作。

這並不意味着您的問題將無法解決。您不指定什麼是您的數據模型,數據分佈的假設等等,但一般而言:

A成爲一個視圖。假設col是您要排序的不可爲空的唯一約束列(用於定義「上一行」是什麼)。現在看看這種查詢。

A AS a 
LEFT JOIN A AS b ON b.col < a.col 
LEFT JOIN A AS c ON c.col < a.col AND c.col > b.col 
... 
WHERE c.col IS NULL 

因爲col是不可爲空,WHERE子句有效地寫着 「ba之間沒有任何東西」。並且因爲b.col必須小於a.col,這意味着b是您剛剛想要的a之前的唯一記錄。

我再重複一次,確保colNOT NULLUNIQUE(可能是主鍵),否則這種方法會非常失敗。

由於潛在的性能問題,此方法不適用於非常大的數據。在這種情況下,您應該指定一個正確排序的連續序列,這將允許您使用新的積分列簡單地減去上面問題中的1。

+0

原諒我,但我想我錯了我的問題!我並不是說我真的在使用「上一行」,而是在上一個月,恰好來自上一行。我的上面的代碼中已經顯示了將會計算出的代碼。 我真正想要問的是,如何將視圖加入自身以便根據內部/左側/任何聯接執行計算? – likelepers

+0

例如,我該如何去做這樣的事情?: CREATE VIEW'主Facebook數據'tt1 AS SELECT col1 AS column1 FROM'clients' t1 JOIN'FB Exports - Key Metrics' t2 ON t1.' id' = t2.'client' LEFT OUTER JOIN'Master Facebook Data' tt2 ON tt1.'Client ID' = tt2.'Client ID' AND month(tt1.'Date')-month(tt2。'Date')= 1 – likelepers

+0

@likelepers - 只要列是'NOT NULL'和'UNIQUE',隨意用'month(Date)'代替'col'。如果您的月份數字序列沒有任何間隙,請隨意簡化。我說你可以對待視圖,因爲你會對待一張桌子,它會起作用。 –