2011-04-12 62 views
2

我有一個包含以下列的交易表: MEMBERID, 的TransactionID, 日期, MethodOfPayment, +多了很多列如何使用GROUP返回同一行的多個列中的T-SQL BY

主鍵由MemberID和TransactionID組成。我需要一個由MemberID將這些行分組的最新日期的查詢。這很簡單,但另外我需要最後一個日期的其餘列,例如MethodOfPayment。我正在尋找最簡單的方法來完成此操作。

我知道這是我可以做到這一點的一種方式,但如果必須爲每個列包含一個子查詢,查詢會變得非常長。我的直覺告訴我必須有更好的方法。

SELECT 
    MemberID, 
    MAX(Date) AS Date, 
    (
     SELECT TOP(1) MethodOfPayment 
     FROM Transactions 
     WHERE MemberID = t.MemberID 
     ORDER BY Date DESC 
    ) AS MethodOfPayment 
FROM Transactions t 
GROUP BY MemberID 
+0

您使用的是哪個版本的SQL Server的另一種方式? – Lamak 2011-04-12 20:48:37

+0

SQL Server 2008 R2 – 2011-04-13 19:11:51

回答

8

一種方式

SELECT t1.* 
FROM(
SELECT 
    MemberID, 
    MAX(Date) AS MaxDate 
    FROM Transactions 
GROUP BY MemberID) t2 
JOIN Transactions t1 ON t2.MaxDate = t1.Date 
AND t2.MemberID = t1.MemberID 

如果你是SQL Server 2005上或向上

;WITH cte AS(SELECT *, 
ROW_NUMBER() OVER(PARTITION BY MemberID ORDER BY date DESC) AS ROW 
FROM Transactions) 

SELECT * FROM cte 
where row = 1 
+1

我不太理解公用表表達式的第二種方式,因爲它甚至沒有表名。 – 2011-04-12 21:23:42

+0

那是因爲我忘了添加它,現在我添加了它 – SQLMenace 2011-04-12 22:34:03