簡體   English   中英

SQL:最大值(count((x))

[英]SQL: max(count((x))

我有一張棒球項目的統計表。 該表上有很多字段,但是我關心的字段是playerIDpos (位置), G (游戲)。

該表具有歷史性,因此每個playerID包含多行(每年/排名一個)。 我想要做的是回到球員在職業生涯中發揮最多的位置。

首先,我想想的是計算每個playerID每個位置的游戲數,然后返回最大值。 如何在SQL中完成? 我正在使用SQL Server。 順便說一句,可能存在聯系的情況,那么max會做什么?

如果玩家在多個游戲中在多個團隊中以相同的位置進行比賽,那么我更傾向於使用sum()函數而不是count,除了使用group by語句作為子查詢之外。 請參閱代碼以獲取解釋。

SELECT playerID, pos, MAX( g_sum )
FROM (
    SELECT DISTINCT playerID, pos, SUM( G ) as g_sum
    FROM player_stats
    GROUP BY id, pos
    ORDER BY 3 DESC
) game_sums
GROUP BY playerID

可能不是確切的答案,至少這是一個不錯的起點,並且在我la腳的測試台上工作了,我在10分鍾內就把它攪了。


至於max()如何處理關系:它沒有(至少據我所知)。 這取決於實際的GROUP BY語句本身,以及最大值在查詢或子查詢中的位置以及顯示方式。

如果我們在外部GROUP BY語句中包含pos ,則在出現平局的情況下,它將同時顯示位置和玩家在所述位置上所玩游戲的數量(該數字相同)。 如果不在GROUP BY語句中,則查詢將使用該列的最后給定值。 因此,如果在子查詢中位置2出現在位置3之前,則完整查詢將顯示位置3作為玩家玩過最多游戲的位置。

在SQL中,我相信這可以做到。 鑒於需要兩次相同的子查詢,因此我希望將其作為存儲過程會更有效。

    SELECT MaxGamesInAnyPosition.playerID, GamesPerPosition.pos
    FROM (
        SELECT playerID, Max(totalGames) As maxGames
        FROM (
            SELECT playerID, pos, SUM(G) As totalGames
            FROM tblStats
            GROUP BY playerId, pos) Tallies
        GROUP BY playerID) MaxGamesInAnyPosition 

    INNER JOIN (
        SELECT playerID, pos, SUM(g) As totalGames
        FROM tblStats
        GROUP BY playerID, pos) GamesPerPosition
    ON (MaxGamesInAnyPosition.playerID=GamesPerPosition.playerId 
        AND MaxGamesInAnyPosition.maxGames=GamesPerPosition.totalGames)

看起來不漂亮,但這是我在linq中內置的內容直接轉換為sql,嘗試一下,看看是否正是您想要的:

SELECT [t2].[playerID], (
    SELECT TOP (1) [t7].[pos]
    FROM (
        SELECT [t4].[playerID], [t4].[pos], (
            SELECT COUNT(*)
            FROM (
                SELECT DISTINCT [t5].[G]
                FROM [players] AS [t5]
                WHERE ([t4].[playerID] = [t5].[playerID]) AND ([t4].[pos] = [t5].[pos])
                ) AS [t6]
            ) AS [value]
        FROM (
            SELECT [t3].[playerID], [t3].[pos]
            FROM [players] AS [t3]
            GROUP BY [t3].[playerID], [t3].[pos]
            ) AS [t4]
        ) AS [t7]
    WHERE [t2].[playerID] = [t7].[playerID]
    ORDER BY [t7].[value] DESC
    ) AS [pos]
FROM (
    SELECT [t1].[playerID]
    FROM (
        SELECT [t0].[playerID]
        FROM [players] AS [t0]
        GROUP BY [t0].[playerID], [t0].[pos]
        ) AS [t1]
    GROUP BY [t1].[playerID]
    ) AS [t2]

這是第二個答案,(我認為)比我昨晚在罐子上的第一個腳踢要好得多。 當然更容易閱讀和理解。

SELECT playerID, pos
FROM (
    SELECT playerID, pos, SUM(G) As totGames
    FROM tblStats
    GROUP BY playerID, pos) Totals
WHERE NOT (Totals.totGames < ANY(
    SELECT SUM(G) 
    FROM tblStats 
    WHERE Totals.playerID=tblStats.playerID
    GROUP BY playerID, pos))

子查詢確保如果在給定位置的游戲總數小於玩家在任何其他位置玩的游戲數量,則所有行都將被拋出。

如果是平局,則有問題的玩家將出現所有並列的行,因為沒有任何並列的記錄將被拋出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM