Sql 查找第二个至最近日期的所有分数
我有一个历史记录表,其中包含每个组每个日期的分数(PK是组,日期)。什么样的SQL查询可以检索最近第二个日期所有组的分数 预计到达时间:各组的日期相同(每组的每个分数在同一时间输入历史记录表) 设置:Sql 查找第二个至最近日期的所有分数,sql,sql-server,tsql,sql-server-2000,Sql,Sql Server,Tsql,Sql Server 2000,我有一个历史记录表,其中包含每个组每个日期的分数(PK是组,日期)。什么样的SQL查询可以检索最近第二个日期所有组的分数 预计到达时间:各组的日期相同(每组的每个分数在同一时间输入历史记录表) 设置: create table ScoreHistory(GroupId int, ScoreDate datetime) insert ScoreHistory select 1, '2011-06-14' union all select 1, '2011-06-15' union
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
试试这个。我试图首先获得
前两个不同的日期描述,如果您只使用日期而不使用日期时间,这将起作用。然后颠倒该表,获得前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]
我认为这可能需要一个,其中y.date=YourTable.date
,但我不确定您是否需要两个聚合
获取每个组的最大日期
获取每个组的最大日期,该日期小于步骤1中的日期
从该聚合返回分数
差不多
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上,使用行号()执行此操作要容易得多 是的,这个查询不会返回他在问题中要求的分数,或者它是在检索该日期内的所有组,它很可能只会得到第二个最近日期的第一次出现。。因此,在不理解代码输出的情况下进行投票是很好的…@Laurence Burke-首先,如果不在问题中显示表结构、输入和所需的输出,那么期望得到准确的答案是不公平的。其次,关于我的答案,如果有一个单独的Score
字段,它可以添加到组中-更新答案。对于2005+版本,通过对组进行排序也order by[date],[group]desc
查询计划似乎可以使用索引。实际上,OP已经澄清,所有组的日期都是相同的。删除注释和-1。所以这个查询现在起作用了,我们知道了。。。你发邮件的时候没有…文件坏了。应该选择不同的前2名[日期]这些答案中有没有任何一个有帮助,或者它们是否遗漏了标记?任何回答都会很好,希望您能够澄清为什么您不评论问题,而任何答案都没有解决您的问题,或者根本没有选择答案。
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
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]
)