我有一個歷史表,其中包含每組日期(PK是組,日期)的分數。什麼是可以檢索第二個最近日期的所有組的分數的SQL查詢?查找所有得分從第二次到最近的日期
ETA:組間的日期相同(每個組每個分數同時輸入到歷史記錄表中)。
我有一個歷史表,其中包含每組日期(PK是組,日期)的分數。什麼是可以檢索第二個最近日期的所有組的分數的SQL查詢?查找所有得分從第二次到最近的日期
ETA:組間的日期相同(每個組每個分數同時輸入到歷史記錄表中)。
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
是的,這個查詢不會返回他在他的問題中請求的分數,或者是它在該日期內檢索所有組,它很可能只會得到第二個最近的日期的第一次發生。所以YAY對於upvotes而不理解代碼輸出... – 2011-06-14 16:34:17
@Laurence Burke - 首先,在問題中沒有顯示錶格結構,輸入和期望輸出的情況下期待確切的答案是不公平的。其次,關於我的回答,如果有一個單獨的「Score」字段,它可以添加到組中 - 更新答案。 – 2011-06-14 16:49:18
對於2005+版本,通過按照[日期],[組] desc排序,查詢計劃似乎能夠使用索引。 – Magnus 2011-06-14 18:13:06
試試這個簡單。我試着首先獲得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
,但我不知道
需要兩個聚集
喜歡的東西
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()更容易...
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]
)
+1 - LOL - GMTA – 2011-06-14 17:00:48
有回答這些問題有助於在所有或者他們缺少的標誌? – 2011-06-14 16:57:06
任何迴應將是很大的希望,你可以澄清你爲什麼沒有評論問題的任何問題沒有解決您的問題,或根本沒有選擇答案。 – 2011-06-16 16:15:41