2016-01-26 97 views
0

我有兩張桌子。一個表被命名爲購物者,它看起來像一對多加入羣組

SHOPPER_ID | SHOPPER_NAME | 
------------------------- 
1   | Marianna  | 
2   | Jason  | 

,並命名爲訂單另一個表有順序,如日期信息

ORDER_ID | SHOPPER_ID | DATE 
---------------------------------- 
1  | 1   | 08/09/2012 
2  | 1   | 08/08/2012 

現在,我想這樣做,連接兩個表和組通過SHOPPER_ID查詢,因爲一個購物者可以有多個訂單,我想根據DATE值選擇最新的訂單。

我的查詢是這樣的:

Select * from Shopper as s join Order as o 
on s.SHOPPER_ID = o.SHOPPER_ID 
group by s.SHOPPER_ID 

查詢是錯誤的,因爲現在我不知道如何過濾僅適用於獲得最新的訂單。提前致謝!

+1

您使用的數據庫是? –

+0

@PiotrSiekierski sql-server,我認爲這是一個sql的通用問題,所以我沒有把它.. – Arch1tect

+0

要小心,命名一個表'ORDER'可能會導致與用於'ORDER BY'的保留字發生衝突 –

回答

2

我建議使用一個子選擇:

Select s.SHOPPER_ID, s.SHOPPER_NAME, o.MAX_DATE 
    from Shopper s 
    INNER join (SELECT SHOPPER_ID, MAX(DATE) AS MAX_DATE 
       FROM ORDER 
       GROUP BY SHOPPER_ID) o 
    on s.SHOPPER_ID = o.SHOPPER_ID 

好運。

0

你需要一個子查詢,讓每購物者的最後一個訂單,然後再加入與購物者和秩序表,以獲得購物者的名稱和訂單ID

SELECT ss.SHOPPER_ID, ss.SHOPPER_NAME, oo.ORDER_ID LAST_ORDER 
FROM (SELECT o.SHOPPER_ID, MAX(o.DATE) [DATE] 
     FROM Shopper s 
     INNER JOIN Order o 
     ON s.SHOPPER_ID = o.SHOPPER_ID 
     GROUP BY o.SHOPPER_ID) mo 
INNER JOIN Shopper ss 
ON mo.SHOPPER_ID = ss.SHOPPER_ID 
INNER JOIN Order oo 
ON mo.SHOPPER_ID = oo.SHOPPER_ID AND mo.DATE = oo.DATE 

這裏的SQL Fiddle來試試吧出

1

簡單的方法是用row_number找到最新的順序

SQL Fiddle Demo

SELECT * 
FROM 
    (SELECT S.*, 
      O.[ORDER_ID], O.[DATE], 
      ROW_NUMBER() OVER (PARTITION BY S.SHOPPER_ID 
           ORDER BY [DATE] DESC) as rn 
     FROM Shopper S 
     JOIN Orders O 
     ON S.SHOPPER_ID = O.SHOPPER_ID 
    ) T 
WHERE rn = 1  
+0

完全有效,取決於行數是否ROW_NUMBER()或CROSS APPLY表現最佳。 –

0
SELECT * 
FROM 
Shopper s 
CROSS APPLY 
(
SELECT TOP 1 * 
FROM 
Order o 
WHERE 
s.SHOPPER_ID = o.SHOPPER_ID 
ORDER BY 
o.DATE DESC 
) o; 
0
Select s.*, o1.* 
From Order as o1 
left join Order as o2 
on (o1.SHOPPER_ID = o2.SHOPPER_ID and o1.DATE < o2.DATE) 
join Shopper as s 
on (s.SHOPPER_ID = o1.SHOPPER_ID) 
where o2.DATE is NULL; 

連接順序表與自身,尋找新的訂單加入它。 「左」連接意味着訂單表中的每一行都將保留在結果中,即使它無法加入到該客戶的較新訂單中。

「where」放棄找到新訂單的所有行。這隻會讓你只有最近的訂單。

將這些結果加入購物者表中以包含購物者數據。

編輯:我建議這個答案,因爲JOIN對於數據庫比子選擇要快得多。