Sql server 如何检索另一列中最近的第三个日期?
编辑:我正在使用SQL Server 2005 所以这里有一个棘手的问题。出于审计目的,我们需要尝试3次联系客户。我们可以尝试3次以上,但出于审计目的,我需要检索每个客户最近第三次尝试的日期Sql server 如何检索另一列中最近的第三个日期?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,编辑:我正在使用SQL Server 2005 所以这里有一个棘手的问题。出于审计目的,我们需要尝试3次联系客户。我们可以尝试3次以上,但出于审计目的,我需要检索每个客户最近第三次尝试的日期 CustID AttemptDate 123 2014-01-02 123 2014-01-05 123 2014-01-06 * retrieve this one 123 2014-01-07 123 2014-01-10 555
CustID AttemptDate
123 2014-01-02
123 2014-01-05
123 2014-01-06 * retrieve this one
123 2014-01-07
123 2014-01-10
555 2014-02-01
555 2014-02-03
555 2014-02-07 * retrieve this one
555 2014-02-12
555 2014-02-20
在大多数情况下,你只需要最近一段时间,这样你就可以做一些事情,比如
SELECT CustID,MAX(AttemptDate) FROM Attempts GROUP BY CustID
。。但在这种情况下,这显然行不通
假设我有一个与客户相关的尝试列表
CustID AttemptDate
123 2014-01-02
123 2014-01-05
123 2014-01-06 * retrieve this one
123 2014-01-07
123 2014-01-10
555 2014-02-01
555 2014-02-03
555 2014-02-07 * retrieve this one
555 2014-02-12
555 2014-02-20
输出:
CustID AttemptDate
123 2014-01-06
555 2014-02-07
实现这一点有什么建议吗?这里的排名功能是您的朋友:
;WITH t AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY CustId ORDER BY AttemptDate DESC) AS nth_most_recent
FROM MyTable
)
SELECT *
FROM t
WHERE nth_most_recent = 3
WITH cte (CustId, AttemptDate, AttemptNumber) AS (
SELECT
CustId,
AttemptDate,
ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY AttemptDate DESC) AS AttemptNumber
FROM Attempts
)
SELECT
CustId,
AttemptDate
FROM cte
WHERE AttemptNumber = 3
或者,如果公共表表达式语法导致问题,则可以使用子查询:
SELECT
CustId,
AttemptDate
FROM (
SELECT
CustId,
AttemptDate,
ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY AttemptDate DESC) AS AttemptNumber
FROM Attempts
) sq
WHERE AttemptNumber = 3
这里的排名功能是您的朋友:
WITH cte (CustId, AttemptDate, AttemptNumber) AS (
SELECT
CustId,
AttemptDate,
ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY AttemptDate DESC) AS AttemptNumber
FROM Attempts
)
SELECT
CustId,
AttemptDate
FROM cte
WHERE AttemptNumber = 3
或者,如果公共表表达式语法导致问题,则可以使用子查询:
SELECT
CustId,
AttemptDate
FROM (
SELECT
CustId,
AttemptDate,
ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY AttemptDate DESC) AS AttemptNumber
FROM Attempts
) sq
WHERE AttemptNumber = 3
这里的排名功能是您的朋友:
WITH cte (CustId, AttemptDate, AttemptNumber) AS (
SELECT
CustId,
AttemptDate,
ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY AttemptDate DESC) AS AttemptNumber
FROM Attempts
)
SELECT
CustId,
AttemptDate
FROM cte
WHERE AttemptNumber = 3
或者,如果公共表表达式语法导致问题,则可以使用子查询:
SELECT
CustId,
AttemptDate
FROM (
SELECT
CustId,
AttemptDate,
ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY AttemptDate DESC) AS AttemptNumber
FROM Attempts
) sq
WHERE AttemptNumber = 3
这里的排名功能是您的朋友:
WITH cte (CustId, AttemptDate, AttemptNumber) AS (
SELECT
CustId,
AttemptDate,
ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY AttemptDate DESC) AS AttemptNumber
FROM Attempts
)
SELECT
CustId,
AttemptDate
FROM cte
WHERE AttemptNumber = 3
或者,如果公共表表达式语法导致问题,则可以使用子查询:
SELECT
CustId,
AttemptDate
FROM (
SELECT
CustId,
AttemptDate,
ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY AttemptDate DESC) AS AttemptNumber
FROM Attempts
) sq
WHERE AttemptNumber = 3
下一个投票人愿意说明下一个投票的原因吗?不是我,但你需要在截止日期前订购DESC@EdmundSchweppe与Anon的样本一样,我得到了一个错误。可能是因为我使用的是SQLServer2005?“关键字“WITH.”附近的语法不正确。@user1003916同样,正如我在上一条评论中所说,您是否尝试添加semicolon?:
;以cte为例(
?我不记得SQL Server 2005是否需要CTE中的列名。我已更新了答案,将列名包括在内。下一个投票人是否愿意说明下一个投票的原因?不是我,但您需要按预定日期订购DESC@EdmundSchweppe与Anon的示例一样,我遇到了一个错误。可能是因为我使用的是sql server 2005?“关键字“WITH.”附近的语法不正确。@user1003916同样,正如我在前面的评论中所说的,您是否尝试添加semicolon?:;使用cte作为(
?我不记得SQL Server 2005是否需要CTE中的列名。我已更新了答案,将列名包括在内。下一个投票人是否愿意说明下一个投票的原因?不是我,但您需要按预定日期订购DESC@EdmundSchweppe与Anon的示例一样,我遇到了一个错误。可能是因为我使用的是sql server 2005?”关键字“WITH.”附近的语法不正确。@user1003916同样,正如我在前面的评论中所说的,您是否尝试添加semicolon?:;使用cte作为(
?我不记得SQL Server 2005是否需要CTE中的列名。我已更新了答案,将列名包括在内。下一个投票人是否愿意说明下一个投票的原因?不是我,但您需要按预定日期订购DESC@EdmundSchweppe与Anon的示例一样,我遇到了一个错误。可能是因为我使用的是sql server 2005?”关键字“WITH.”附近的语法不正确。@user1003916同样,正如我在前面的评论中所说的,您是否尝试添加semicolon?:;使用cte作为(
?我不记得SQL Server 2005是否需要CTE中的列名。我已经更新了答案,将它们包括在内。我没有提到我一直使用SQL Server 2005。这会给我带来错误,我不完全确定是哪个部分造成的。我猜是不兼容。”关键字“WITH”附近的语法不正确。/关键字“GROUP”附近的语法不正确。@user1003916这是因为此答案中使用的语法错误。它应该是分区依据
,而不是分组依据
@Anon我仍然得到“关键字“WITH”附近的语法不正确”。“我使用该代码逐字进行测试this@user1003916看,在添加此答案之前,您还有其他代码吗?请尝试在开头添加一个符号:;并将t作为(
@user1003916如果语句以关键字开头,则前一个语句需要以分号正确终止。我没有提到我一直使用SQL Server 2005。这会给我带来错误,我不完全确定是哪个部分造成的。我猜是不兼容。“关键字“WITH”附近的语法不正确。/关键字“GROUP”附近的语法不正确。@user1003916这是因为此答案中使用的语法错误。它应该是分区依据
,而不是分组依据
@Anon我仍然得到“关键字“WITH”附近的语法不正确”。“我使用该代码逐字进行测试this@user1003916看,在添加此答案之前,您还有其他代码吗?请尝试在开头添加一个符号:;并将t作为(
@user1003916如果语句以关键字开头,则前一个语句需要以分号正确终止。我没有提到我一直使用SQL Server 2005。这会给我带来错误,我不完全确定是哪个部分造成的。我猜是不兼容。“关键字“WITH”附近的语法不正确。/关键字“GROUP”附近的语法不正确。@user1003916这是因为此答案中使用的语法错误。它应该是分区依据
,而不是分组依据
@Anon我仍然得到“关键字“WITH”附近的语法不正确”。“我使用该代码逐字进行测试this@user1003916看,在添加此答案之前,您还有其他代码吗?请尝试在开头添加一个符号:;并将t作为(
@user1003916如果语句以关键字开头,则前一个语句需要以分号正确终止。我没有提到我一直使用SQL Server 2005。这会给我带来错误,我不完全确定是哪个部分造成的。我猜是不兼容。“关键字“WITH”附近的语法不正确。/关键字“GROUP”附近的语法不正确。@user1003916这是因为此答案中使用的语法错误。它应该是分区依据
,