簡體   English   中英

我想要特定月份+年份中所有玩家的最后一行

[英]I want the last row of all players in a specific month+year

這是我的 2 個月 sql 表的簡化版本(按日期排序):

player_id | 日期 | 分數
1 2011-05-25 1200
2 2011-05-25 3400
3 2011-05-26 3200
4 2011-05-26 4400
1 2011-05-28 1000
2 2011-05-28 2000
3 2011-05-29 3000
4 2011-05-29 4000
1 2011-06-24 1300
2 2011-06-24 2500
3 2011-06-24 5000
4 2011-06-24 3000

基本上,我想要一個查詢,顯示特定月份/特定年份中所有玩家的最后得分。

例子:

如果我想要所有玩家在 05 月的最終得分,那么結果將是:
1 2011-05-28 1000
2 2011-05-28 2000
3 2011-05-29 3000
4 2011-05-29 4000

到目前為止我的 sql 查詢:

  SELECT m1.* FROM table m1 
    LEFT JOIN table m2 ON (m1.player_id = m2.player_id AND m1.date < m2.date) 
    WHERE m2.date IS NULL 
    AND month(m1.date) = 05 
    AND year(m1.date) = 2011 
    ORDER BY score DESC); 

這似乎沒有顯示所有玩家,只顯示05年后幾個月沒有玩的玩家。我在哪里添加日期選擇?

**編輯 John Nestoriak 的回答對我有用:)

我認為他指的是此處顯示的技術: 檢索每組中的最后一條記錄

加上他不想要最后一條記錄,而是給定月份的最后一條記錄的附加約束。

奇怪的是,您必須兩次提供額外的約束,一次是在連接條件中,一次是過濾結果。 這應該為你做。

SELECT m1.* FROM table m1 
  LEFT JOIN table m2 ON 
    (m1.player_id = m2.player_id AND m1.date < m2.date 
     AND m2.date < '2011-06-01') 
  WHERE m2.date IS NULL AND month(m1.date) = 5 AND year(m1.date) = 2011

假設Unique中的(player_id, date)組合:

SELECT 
      t.*
FROM 
      TableX AS t
  JOIN
      ( SELECT 
              player_id
            , MAX(date) AS maxDate
        FROM
            TableX
        WHERE 
             date BETWEEN '2011-05-01'
                      AND LAST_DAY('2011-05-01')
        GROUP BY
              player_id
      ) AS tg
    ON  
      (tg.player_id, tg.maxDate) = (t.player_id, t.date)
ORDER BY 
      t.score DESC

暫無
暫無

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

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