如何在 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())
如果您想要每个 ID
和 agent_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
如果您想要每个 ID
和 agent_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
我正在尝试每周一次从 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())
如果您想要每个 ID
和 agent_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
如果您想要每个 ID
和 agent_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