如何在 SQL 语句中每周获取最新记录

How to get latest record weekly within an SQL statement

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

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

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

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

这将return记录从本周的第一天到本周的最后一天

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

试试这个

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

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

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

如果您想要每个 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

在这个解决方案中,我在 CTE 中创建了一个 table 并定义了一个时间段内一周的第一天。然后在星期的第一天和我们的实际查询之间创建一个 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