繁体   English   中英

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

[英]How to get latest record weekly within an SQL statement

我试图每周一次从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())

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

   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创建一个表,并定义一个时段内的第一天。 然后在几周的第一天和我们的实际查询之间进行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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM