2012-11-06 86 views
3

我有一個MySQL表像下面比較在同一個表中的行中的MySQL

id trader price 
111 abc 5 
222 xyz 5.20 
333 abc 5.70 
444 xyz 5 
555 abc 5.20 

我需要比較第1行的價格與行2的價格和accroding給定的樣本行2的價格低於第1行的價格這意味着交易者xyz曾經提高了價格,同樣當我們將第2排的價格與第3排的價格進行比較時,第3排的價格高於第2排的價格,這意味着交易者abc也提高了價格一次。因此,在這種方式我需要比較整個表,發現每個商人有多少次增加或減少價格...

我沒有任何想法要做到這一點,有人可以幫助我在此

回答

0

你如果你想跟蹤價格變化的歷史,將需要設置一個單獨的表。另外,當你引用列時,它聽起來像你的意思是行。

+0

是的,我很抱歉,我指的是行作爲列...能否請你幫我在如何做到這一點 – user1793864

4

您可以執行「自我連接」(將表連接到自身)以執行查詢。這裏棘手的部分是知道行被插入到表中的順序,並且只比較順序(時間上)相鄰的行。我假設你有某種TIMESTAMP列,它會告訴你在先前價格變化之後出現了哪些價格變化。如果不是,那麼也許「身份證」可以通知你(在較小的ID之後插入更大的ID行)。

呼喚你的表「選項卡」,使用「TRADER」提供的連接,並使用「ID」,以提供訂單,查詢將需要三路自加入這樣如下:

SELECT a.trader 
    , SUM(IF(a.price > b.price, 1, 0)) nbr_incr 
    , SUM(IF(a.price < b.price, 1, 0)) nbr_decr 
    , SUM(IF(a.price = b.price, 1, 0)) nbr_same 
    FROM tab a 
    JOIN tab b 
    ON a.trader = b.trader AND a.id > b.id 
    LEFT OUTER JOIN tab c 
    ON a.trader = c.trader AND a.id > c.id AND b.id < c.id 
WHERE c.id IS NULL 
GROUP BY a.trader 

上述查詢連接表以本身兩次,使得每個標籤代表以下:

  • 選項卡:該更近的行進行比較
  • 選項卡b:將之前即刻行進行比較的
  • 標籤C:一個& b隨時間之間的行(不應該存在)

我們執行LEFT OUTER JOIN到「選項卡C」,因爲我們其實不願意該行存在。在where子句中,我們只將結果過濾到「選項卡c」行不存在的結果。

最後,查詢在交易者上執行'GROUP BY',SUM()通過比較'a'和'b'行的價格來獲得增量和減量。

這是一個有趣的挑戰。希望這可以幫助!

約翰。

+0

嗨約翰非常感謝您的查詢幫了我很多得到這是一個想法。這是非常有用的...非常感謝您的大力幫助 – user1793864

+0

如果這回答您的問題,請接受它作爲答案。謝謝! –