2011-06-22 80 views
0

可以說我有一張存儲競賽結果的表格。每天,有幾輛賽車在賽道周圍競跑,並且記錄下位置。 (這是一個粗略的簡化,但它跨越得到點)這裏是否需要嵌套查詢?

表看起來是這樣的:

|Driver | Position | Date 
Andy  1   22/06/2011 
Paul  2   22/06/2011 
Cliff 3   22/06/2011 
Andy  2   21/06/2011 
Paul  1   21/06/2011 
Cliff 3   21/06/2011 

等等......

我想編寫一個查詢返回的司機在某一日期的職位,也是前一天的職位。我想爲此返回以下列:

|Driver | Position | Date  | Position Yesterday 
Andy  1   22/06/2011 2 
Paul  2   22/06/2011 1 
Cliff 3   22/06/2011 3 

我認爲我將不得不編寫一個嵌套查詢,但我真的不知道從哪裏開始。我知道我可以多次調用數據庫並在我的應用程序中創建結果,但我不認爲這是最佳實踐。

+1

你爲什麼返回日期?這是多餘的。 –

+0

是的,你是對的,它是。它不必返回日期。 –

回答

4
SELECT 
    [today].*, 
    [yesterday].Position 
FROM 
    yourTable AS [today] 
LEFT JOIN 
    yourTable AS [yesterday] 
    ON [today].Driver = [yesterday].Driver 
    AND [today].Date = [yesterday].Date + 1 
WHERE 
    [today].Date = '22/06/2011' 
+1

只是一個頭。如果OP使用SQL Server 2008並且數據類型爲「DATE」,則「Date + 1」將失敗。 –

+0

我猜測一樣多:)。順便說一句,你已經有了我的+1。 –

0

您可以使用UNION,其中一個查詢爲UNION結果的第一個結果查詢第二個結果。這應該回到它的正確方法:

SELECT * FROM * WHERE =

UNION

SELECT * FROM * WHERE =

填寫的* S爲您的需求。

+0

他試圖添加額外的列,而不是額外的行... – MatBailie

+0

owh我的壞,在這種情況下誤讀。 – Manuel

0

您可以通過加入來完成此操作,搜索前一天。

4

你可以不留參加這樣的:

select 
    r1.driver, 
    r1.position, 
    r1.date 
    r2.position as prev_pos 
from 
    results r1 
left join 
    results r2 on r1.driver = r2.driver and r2.date = r1 - INTERVAL 1 DAY; 
2

嵌套似乎進行更好(感謝@Dems他的評論) 通過過濾日期自我加入表格。在(司機,日期)聯合使用和索引

SELECT t1.Driver,t1.Position, t1.Date, t2.Position 
FROM table t1 
LEFT JOIN (SELECT Driver, Position FROM table ON t1.Driver = t2.Driver AND t2.date ='21/06/2001') ON t1.Driver = t2.Driver 
WHERE t1.date = '22/06/2011' 
+0

您需要將'AND t2.date = '21/06/2011''放在左連接中。如果昨天沒有記錄,'t2.date'將爲NULL,並導致WHERE子句失敗。 – MatBailie

+0

已修復!謝謝!! – niktrs

+0

我現在不能測試這個,但是'DATEDIFF(DAY,a,b)= 1' SARGable?和/或,這將如何與'a = DATEADD(DAY,-1,b)'比較? – MatBailie

0

我不能在這裏,但這裏測試SQL查詢是一些僞SQL碼,如果翻譯成正確的SQL可能的工作:

SELECT 
    today.driver, 
    today.position, 
    today.date, 
    yesterday.position 
FROM 
    your_table today, 
    (SELECT driver, position, (date - 1 day) "date" FROM your_table) yesterday 
WHERE 
    today.driver = yesterday.driver AND 
    today.date = yesterday.date 

這當然不能編譯,而且我也不是100%確定where子句。您可能必須執行一些左/右外連接。此外,當最後一場比賽不是昨天,而是前一天時,你會遇到問題。

希望這有助於反正。

+1

這是一個奇怪的做法,雖然它當然可以工作。除了一件事......你需要在今天添加一天到昨天的日子,你從昨天開始的一天,這意味着你將加入明天的記錄。 – MatBailie

+0

我在考慮日期 - 一天以一種邏輯的方式,當然它最終必須以相反的方式完成。不過,我寧可選擇以任何方式發佈的解決方案。剛發佈我的時候,就沒有在已經發布的答案列表中 –

0

只是另一種選擇:

@givendate = '22/06/2011' 

SELECT t1.Driver 
    , t1.Position 
    , t1.Date 
    , (SELECT t2.Position 
     FROM table t2 
     WHERE t2.Driver = t1.Driver 
      AND t2.date = DATEADD(day, @givendate, -1) 
     ) AS PositionYesterday 
FROM table t1 
WHERE t1.date = @givendate