Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何检索另一列中最近的第三个日期?_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 如何检索另一列中最近的第三个日期?

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

编辑:我正在使用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       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这是因为此答案中使用的语法错误。它应该是
分区依据