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

我有一个历史记录表,其中包含每个组每个日期的分数(PK是组,日期)。什么样的SQL查询可以检索最近第二个日期所有组的分数

预计到达时间:各组的日期相同(每组的每个分数在同一时间输入历史记录表)

设置:

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]
    )