2011-06-14 80 views
3

我有一個歷史表,其中包含每組日期(PK是組,日期)的分數。什麼是可以檢索第二個最近日期的所有組的分數的SQL查詢?查找所有得分從第二次到最近的日期

ETA:組間的日期相同(每個組每個分數同時輸入到歷史記錄表中)。

+0

有回答這些問題有助於在所有或者他們缺少的標誌? – 2011-06-14 16:57:06

+0

任何迴應將是很大的希望,你可以澄清你爲什麼沒有評論問題的任何問題沒有解決您的問題,或根本沒有選擇答案。 – 2011-06-16 16:15:41

回答

4
select * 
from ScoreHistory sc1 
where exists 
(
    select GroupId, max(ScoreDate) RecentScoreDate 
    from ScoreHistory sc2 
    where not exists 
    (
     select GroupId, max(ScoreDate) RecentScoreDate 
     from ScoreHistory sc3 
     group by GroupId 
     having GroupId = sc2.GroupId and max(ScoreDate) = sc2.ScoreDate 
    ) 
    group by GroupId 
    having GroupId = sc1.GroupId and max(ScoreDate) = sc1.ScoreDate 
) 

設置:

create table ScoreHistory(GroupId int, ScoreDate datetime) 

insert ScoreHistory 
    select 1, '2011-06-14' union all 
    select 1, '2011-06-15' union all 
    select 1, '2011-06-16' union all 
    select 2, '2011-06-15' union all 
    select 2, '2011-06-16' union all 
    select 2, '2011-06-17' 

查詢將看起來下面的MS SQL 2005 +

;with cte 
as 
(
    select *, row_number() over(partition by GroupId order by ScoreDate desc) RowNumber 
    from ScoreHistory 
) 
select * 
from cte 
where RowNumber = 2 
+0

是的,這個查詢不會返回他在他的問題中請求的分數,或者是它在該日期內檢索所有組,它很可能只會得到第二個最近的日期的第一次發生。所以YAY對於upvotes而不理解代碼輸出... – 2011-06-14 16:34:17

+1

@Laurence Burke - 首先,在問題中沒有顯示錶格結構,輸入和期望輸出的情況下期待確切的答案是不公平的。其次,關於我的回答,如果有一個單獨的「Score」字段,它可以添加到組中 - 更新答案。 – 2011-06-14 16:49:18

+0

對於2005+版本,通過按照[日期],[組] desc排序,查詢計劃似乎能夠使用索引。 – Magnus 2011-06-14 18:13:06

2

試試這個簡單。我試着首先獲得TOP 2 DISTINCT Dates Desc,如果您只使用日期而不使用日期時間,那麼這將起作用。然後扭轉該表並獲取TOP 1並將該結果作爲第二個最近的日期來獲得小組成績。

SELECT * 
FROM YourTable 
INNER JOIN 
(SELECT TOP 1 x.[date] 
FROM 
    (SELECT TOP 2 DISTINCT [date] 
    FROM YourTable 
    ORDER BY [date] DESC) AS x 
ORDER BY [date] ASC) AS y 
ON y.[date] = YourTable.[date] 

我想,這可能需要一個WHERE y.date = YourTable.date,但我不知道

+0

實際上,OP已經澄清說,所有組的日期都是相同的。評論和-1刪除。所以這個查詢工作*現在*我們知道這一點......你沒有當你發佈...... – gbn 2011-06-14 16:55:00

+0

@gbn謝謝你刪除你的-1。 – 2011-06-14 16:58:36

+0

DISTINCT出現故障。應該是SELECT DISTINCT TOP 2 [日期] – kylemac 2013-08-24 15:53:36

3

需要兩個聚集

  1. 獲得每組最多日期
  2. 獲取未滿最大值每個組日期從步驟1開始的日期
  3. 加入此累積記分

喜歡的東西

SELECT 
    Group, Date, Score 
FROM 
    (..2nd max date per group 
    SELECT 
     Group, MAX(Date) AS TakeMe 
    FROM 
     (--max date per group 
     SELECT 
      Group, MAX(Date) AS IgnoreMe 
     FROM 
      MyTable 
     GROUP BY 
      Group 
     ) ex 
     JOIN 
     MyTable M ON ex.Group = M.Group AND ex.IgnoreMe > M.Date 
    GROUP BY 
     M.Group 
    ) inc 
    JOIN 
    MyTable M2 ON inc.Group = M2.Group AND inc.TakeMe = M2.Date 

這是這麼多 SQL Server 2005上使用ROW_NUMBER()更容易...

2
SELECT * 
FROM tblScore 
WHERE EXISTS 
(
    SELECT NULL 
    FROM tblScore as tblOuter 
    WHERE NOT EXISTS 
    (
     SELECT NULL 
     FROM tblScore As tblInner 
     WHERE tblInner.[group] = tblOuter.[group] 
     GROUP BY [group] 
     HAVING MAX(tblInner.[date]) = tblOuter.[date] 
    ) 
    AND tblOuter.[group] = tblScore.[group] 
    GROUP BY [group] 
    HAVING MAX(tblOuter.[date]) = tblScore.[date] 
) 
+0

+1 - LOL - GMTA – 2011-06-14 17:00:48