【问题标题】:Find all scores for the 2nd to most recent date查找第二个到最近日期的所有分数
【发布时间】:2011-06-14 16:13:03
【问题描述】:

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

ETA:各组的日期相同(每个组的每个分数同时输入到历史表中)。

【问题讨论】:

  • 这些答案是否有任何帮助,或者他们是否错过了标记?
  • 任何回复都非常希望您能澄清为什么您没有评论任何没有解决您的问题或根本没有选择答案的答案的问题。

标签: sql sql-server tsql sql-server-2000


【解决方案1】:
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

【讨论】:

  • 是的,这个查询不返回他在他的问题中请求的分数,或者它是否检索了该日期内的所有组,它很可能只会获得第二个最近日期的第一次出现。所以在不理解代码输出的情况下支持投票......
  • @Laurence Burke - 首先,在问题中没有显示表格结构、输入和所需输出的情况下期望得到准确的答案是不公平的。其次,关于我的回答,如果有单独的 Score 字段,可以将其添加到组中 - 更新答案。
  • 对于 2005+ 版本,通过对组也进行排序 order by [date], [group] desc 查询计划似乎能够使用索引。
【解决方案2】:

你需要两个聚合

  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() 更容易...

【讨论】:

    【解决方案3】:
    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]
    )
    

    【讨论】:

      【解决方案4】:

      试试这个。我正在尝试首先获取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,但我不确定

      【讨论】:

      • 实际上,OP 已经澄清所有组的日期都是相同的。评论和 -1 被删除。因此,此查询现在有效,我们知道...您发布时没有...
      • DISTINCT 出现故障。应该是 SELECT DISTINCT TOP 2 [日期]
      猜你喜欢
      • 2019-02-26
      • 2020-02-05
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      相关资源
      最近更新 更多