【问题标题】:How to get latest record weekly within an SQL statement如何在 SQL 语句中每周获取最新记录
【发布时间】:2015-05-27 03:11:05
【问题描述】:

我正在尝试每周一次从 SQL Server 2005 数据库中导出最新记录。这是我的桌子:

agent_name  date          ID
ALEX        2015-05-25    13
ALEX        2015-05-22    13
ALICE       2015-05-24    10
ALICE       2015-05-26    10

如何创建输出表应该是这样的:

agent_name  date          ID
ALEX        2015-05-25    13
ALICE       2015-05-26    10

我的 SQL 脚本:

SELECT a.agent_name,  
       a.date, 
       a.ID 
FROM Payment a 
INNER JOIN agentmaster b ON a.ID = b.ID2 
WHERE b.agent ='Y'
AND a.date >= DATEADD(day, -7, GETDATE())

【问题讨论】:

    标签: sql sql-server date sql-server-2005


    【解决方案1】:

    如果您想要每个 IDagent_name 的最新行,请使用:

    SELECT a.agent_name,  
           MAX(a.[date]) [date], 
           a.ID
    FROM Payment a 
    GROUP BY
        a.agent_name,  
        a.ID
    

    如果您希望每周都有最新的行,请使用:

    SELECT a.agent_name,  
           a.date, 
           a.ID
    FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY DATEPART(WEEK, [date]) ORDER BY [date] DESC) seq
          FROM Payment ) a 
    WHERE
        seq = 1
    

    如果您希望每个 IDagent_name 每周都有最新的行,请使用:

    ;WITH p AS (
        /* add your query here */
    )
    SELECT a.agent_name,  
           a.date, 
           a.ID
    FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY agent_name, ID, DATEPART(WEEK, [date]) ORDER BY [date] DESC) seq
          FROM p ) a 
    WHERE
        seq = 1
    

    【讨论】:

    • 我想要每个 ID 和 agent_name 的最新行,但我使用的是内部联接。我的脚本SELECT a.agent_name, a.date, a.ID FROM Payment a INNER JOIN agentmaster b ON a.ID = b.ID2 WHERE b.agent ='Y' AND a.date >= DATEADD(day, -7, GETDATE())
    • @alvin 您可以使用WITH 并在其中添加您的联合查询;)。
    【解决方案2】:

    试试这个

    SELECT ID, Agent_Name, MAX(Date) Max_Date
    FROM AgentMaster
    GROUP BY Agent_Name, ID
    

    如果要添加日期过滤器,请添加 where 条件

    date >= DATEADD(day,-7, GETDATE())
    

    【讨论】:

    • 我认为这将返回最近的记录,而问题中的输出示例显示两条记录。
    • 不工作,为什么SELECT a.agent_name, MAX(a.date), a.ID FROM Payment a INNER JOIN agentmaster b ON a.ID = b.ID2 WHERE b.agent ='Y' AND a.date >= DATEADD(day, -7, GETDATE())
    【解决方案3】:

    这将返回从当前一周的第一天到当前一周的最后一天的记录

       SELECT a.agent_name  
              ,a.date 
              ,a.ID 
       FROM Payment a INNER JOIN agentmaster b 
            ON a.ID = b.ID2 
       WHERE b.agent ='Y' AND 
             (a.date BETWEEN 
                     DATEADD(wk, DATEDIFF(wk, 0, GetDate()),0) AND
                     DATEADD(wk, DATEDIFF(wk, 0, GETDATE()),6))
    

    【讨论】:

    • 如何返回最新的
    • 返回一周第一天到一周最后一天的记录
    • 您的代码似乎获得了一周内的所有数据。如何仅获取一周的最后一天(最新记录)
    • @alvin 您应该已经解决了您的问题以表达您需要最新记录的事实。您在问题中的示例中返回了两条记录。
    【解决方案4】:

    在这个解决方案中,我在CTE 中创建了一个表格,并定义了一个周期内一周的第一天。然后在几周的第一天和我们的实际查询之间创建一个JOIN

    样本数据

    DECLARE @tbl TABLE(agent_name VARCHAR(10) ,[date] date, Id INT)
    
    INSERT @tbl
    SELECT 'ALEX'  ,      '2015-05-25'  ,  13 UNION
    SELECT 'ALEX'  ,      '2015-05-22'  ,  13 UNION
    SELECT 'ALICE' ,      '2015-05-24'  ,  10 UNION
    SELECT 'ALICE' ,      '2015-05-26'  ,  10
    
    SELECT * FROM @tbl
    

    查询

    -- This period can be changed
    DECLARE @StartDate date = '01/01/2015'
    DECLARE @EndDate date = '01/01/2016'
    
    ;WITH Numbers (Number)
    AS
    (
      SELECT number
      FROM master..spt_values
      WHERE [type] = 'P'
     )
    ,firstDayOfWeek (fWDate)
    AS
    (
      SELECT DATEADD(DAY, n.Number, @StartDate)
      FROM Numbers AS n
      WHERE n.Number <= DATEDIFF(DAY, @StartDate, @EndDate)
      AND DATEPART(WEEKDAY, DATEADD(DAY, n.Number, @StartDate)) = 1 --Defines first day of week
     )
    SELECT t.agent_name, Max(t.date) AS [date], t.Id
    FROM @tbl AS t
    INNER JOIN firstDayOfWeek AS fw ON t.date >= fw.fWDate
    AND t.[date] < DATEADD(DAY, 7, fw.fWDate)
    GROUP BY t.Id, t.agent_name 
    

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 2015-06-26
      • 2016-05-15
      • 1970-01-01
      相关资源
      最近更新 更多