2012-11-11 67 views
2

遇到的第一行的值我有一個這樣的查詢:採取非集合表達式

SELECT PlayerID, COUNT(PlayerID) AS "MatchesPlayed", Name, Role, Team, 
     SUM(Goals) As "TotalGoals", SUM(Autogoals) As "TotalAutogoals", 
     SUM(...)-2*SUM(...)+2*SUM(...) AS Score, ... 
FROM raw_ordered 
GROUP BY PlayerID 
ORDER BY Score DESC 

其中raw_ordered的每一行描述了一些比賽的一些球員的表現,按時間倒序排列。

自從我被PlayerID分組我從這個查詢得到的是其中每一行提供的一些球員的累計數據的表格。現在,聚合函數的列沒有問題;我的問題是與Team列。

球員在一個賽季中可能會改變球隊;我在這裏感興趣的是最後Team他玩過,所以我想告訴SELECTTeam列的每個組中遇到的第一個值(或者一般而言,對於非 - 聚集函數列)。

不幸的是,我似乎沒有找到任何(容易)的方式SQLite中做到這一點:的SELECTdocumentation說:

如果表達式爲集合表達式,它在所有行評估在小組裏。否則,它針對單個任意選擇行選自內進行評價。

沒有關於如何改變這種現象,我不能聚合函數任何只需要它遇到的第一個值之間找到建議。

有什麼想法?

回答

1

SQLite沒有一個「第一」聚合函數;你將不得不自己實現它。

但是,文件是過時的。由於SQLite 3.7.11,如果有MIN()MAX(),保證選擇最小/最大值來自的記錄。

因此,只需添加MAX(MatchDate)SELECT列的列表。

+0

完美,它的工作,感謝您! –

0
SELECT PlayerID, COUNT(PlayerID) AS "MatchesPlayed", Name, Role, 
(SELECT Team FROM raw_ordered GROUP BY PlayerID ORDER BY some_date) AS team, 
SUM(Goals) As "TotalGoals", SUM(Autogoals) As "TotalAutogoals", 
SUM(...)-2*SUM(...)+2*SUM(...) AS Score, ... 
FROM raw_ordered 
GROUP BY PlayerID 
ORDER BY Score DESC 

想必你有辦法在你的桌子訂購輸出,這樣你可以使用子查詢來實現自己的目標。

+1

通過'PlayerID'子查詢分組擊敗它的目的,因爲排序是不是考慮在分組查詢,非集合列。刪除子查詢中的GROUP BY並向PlayerID添加一個約束(即,它必須與父代和子查詢中的相同),它工作正常,但它很慢... –