如何在SQL中选择后一行

如何在SQL中选择后一行,sql,sql-server,Sql,Sql Server,我的结果集如下所示: 正如您所看到的,一些联系人ID重复使用相同的问题回答。还有一个有不同的问题回答(有红线的那一个) 我想按联系人ID对其进行分组,但选择后一行。例如:如果是ContactID=78100299,我想选择带有CreateDate=17:00:44.907(或rowNum=2)的行 我试过这个: select ContactID, max(QuestionResponse) as QuestionResponse, max(CreateDate) as

我的结果集如下所示:

正如您所看到的,一些
联系人ID
重复使用相同的
问题回答
。还有一个有不同的
问题回答
(有红线的那一个)

我想按联系人ID对其进行分组,但选择后一行。例如:如果是
ContactID=78100299
,我想选择带有
CreateDate=17:00:44.907
(或rowNum=2)的行

我试过这个:

select
    ContactID,
    max(QuestionResponse) as QuestionResponse,
    max(CreateDate) as CreateDate
from  
    theResultSet
group by 
    ContactID
这将不起作用,因为对于相同的
联系人ID
,可能会有
问题响应
2,然后是1。在这种情况下,后一个将是响应为1而不是2的

谢谢您的帮助。

我会这样使用行号()

WITH Query AS
(
    SELECT rowNum, ContactID, QuestionResponse, CreateDate,
    ROW_NUMBER() OVER (PARTITION BY ContactID ORDER BY CreateDate DESC) Ordered
    FROM theResultSet
)
SELECT * FROM Query WHERE Ordered=1
  • 按日期、降序在ContactID组中分配号码
  • 具有数字1的筛选结果

  • 如果您的SQL引擎能够处理它,这可能会起作用

    SELECT trs1.*
      FROM theResultSet trs1
           INNER JOIN
           (SELECT ContactID, max(CreateDate) as CreateDate
              FROM theResultSet
             GROUP BY ContactID) trs2
           ON     trs1.ContactID = trs2.ContactID
              AND trs1.CreateDate = trs2.CreateDate
    
    最终结果将是结果集中的所有行,其中创建日期为最大创建日期。

    这也应该适用:

    SELECT
        ContactID, QuestionResponse,CreateDate
    FROM (
        select rowNum, ContactID, QuestionResponse,CreateDate,
        max(rowNum) over(partition by ContactID) as maxrow
        from    theResultSet
        ) x
    WHERE rowNum=maxrow
    

    您的SQLServer版本是什么?请将结果集粘贴为text max(rowNum)是否不适用于同一分组?max(rowNum)有帮助!谢谢你,西蒙!!谢谢你的回复。我试图避免进行自连接,我不会在这里使用
    group
    这个词,因为
    groupby
    在SQL中已经有了某种含义。我会使用sql中实际存在的单词<代码>分区
    ——即使你必须定义你的意思,至少它不会含糊不清。