【问题标题】:Select first and last record each day每天选择第一条和最后一条记录
【发布时间】:2014-06-24 08:50:38
【问题描述】:

我有一张表,其工程师 ID、DateTimeCreated 为 DateTime、JobID 和 AuditTypeID

我需要在查询的每一行显示第一个(engineerID,JobID 和 AuditTypeID 1)和最后一个(engineerID,JobID 和 AuditTypeID 2)。

SELECT TOP (100) PERCENT 
    dbo.AuditTrail.EngineerId, 
    dbo.AuditTrail.AuditTypeId, 
    dbo.Engineers.Name, 
    dbo.Engineers.EngineerTypeCode, 
    dbo.AuditTrail.JobId, 
    CAST(dbo.AuditTrail.DateTimeCreated AS Date) AS _Date
FROM
    dbo.AuditTrail 
INNER JOIN
    dbo.Engineers 
    ON dbo.AuditTrail.EngineerId = dbo.Engineers.EngineerId
WHERE        
    (dbo.AuditTrail.AuditTypeId = 1) AND 
    (dbo.Engineers.EngineerTypeCode = 'p') AND 
    (dbo.Engineers.EngineerTypeCode = 'p') AND 
    (DATEPART(mm, dbo.AuditTrail.DateTimeCreated) = 6) AND 
    (DATEPART(YYYY, dbo.AuditTrail.DateTimeCreated) = 2014)    
group by 
    AuditTrail.engineerID, 
    JobID, 
    AuditTypeId, 
    Engineers.name, 
    Engineers.EngineerTypeCode, 
    CAST(dbo.AuditTrail.DateTimeCreated AS Date)
ORDER BY 
    dbo.AuditTrail.EngineerID DESC

对于我的查询的第一部分。不幸的是,我看不到每天选择第一条记录

任何帮助将不胜感激

【问题讨论】:

  • 请提供您的预期结果
  • “在查询的每一行上”是什么意思?

标签: sql sql-server sql-server-2008


【解决方案1】:

首先获取您需要的数据,包括创建日期。然后按日期对数据进行分组,选择每天的最小值。最后,加入这两组,只选择每一天的最小值——即每一天的第一次出现。

with
AllMonth( EngineerId, AuditTypeId, Name, EngineerTypeCode, JobId, DateTimeCreated )as(
  SELECT TOP (100) PERCENT 
      a.EngineerId, 
      a.AuditTypeId, 
      e.Name, 
      e.EngineerTypeCode, 
      a.JobId, 
      a.DateTimeCreated
  FROM  dbo.AuditTrail a
  JOIN  dbo.Engineers  e
    ON  e.EngineerId = a.EngineerId
   AND  e.EngineerTypeCode = a.EngineerTypeCode
  WHERE        
        a.AuditTypeId = 1
    AND a.EngineerTypeCode = 'p'
    AND a.DateTimeCreated >= DateAdd( mm, DateDiff( mm, 0, GetDate()), 0)
    AND a.DateTimeCreated < DateAdd( mm, DateDiff( mm, 0, GetDate()) + 1, 0)
),
FirstByDay( MinDate )as(
  select  Min( DateTimeCreated )
  from    AllMonth
  group by cast( DateTimeCreated AS Date )
)
select  *
from    AllMonth a
join    FirstByDay f
  on    f.MinDate = a.DateTimeCreated
ORDER BY a.EngineerID DESC;

要获取每天的最后一项,只需将max 添加到FirstByDay 并添加到联接中。如果你真的想的话,把它排成一排。

顺便说一句,几年前我不是听说更高版本的 MSSQL 忽略了top (100) percent 吗?这些天我不怎么用它,我的记忆是……嗯,只是……在这附近的某个地方……

【讨论】:

  • 谢谢,我试试看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
相关资源
最近更新 更多