【问题标题】:SQL Server Group By Order By WhereSQL Server 按顺序分组
【发布时间】:2013-09-13 06:50:07
【问题描述】:

我有一个表,我需要根据用户 ID 拉回 5 个最近的记录并关闭 documentID(无重复项)。基本上,我正在跟踪访问过的页面并试图拉回用户最近的 3 个页面。

样本数据:

╔══════════════════════════════════════════════╗
║UserID   DocumentID   CreatedDate             ║
╠══════════════════════════════════════════════╣
║  71         22       2013-09-09 12:19:37.930 ║
║  71         25       2013-09-09 12:20:37.930 ║
║  72          1       2012-11-09 12:19:37.930 ║
║  99         76       2012-10-10 12:19:37.930 ║
║  71         22       2013-09-09 12:19:37.930 ║
╚══════════════════════════════════════════════╝

如果用户 ID = 71 时所需的查询结果:

╔══════════════════════════════════════════════╗
║UserID    DocumentID  CreatedDate             ║
╠══════════════════════════════════════════════╣
║  71         25       2013-09-09 12:20:37.930 ║
║  71         22       2013-09-09 12:19:37.930 ║
╚══════════════════════════════════════════════╝

【问题讨论】:

  • 您是否尝试过自己编写脚本?如果是这样,即使是错误的也请发布。

标签: sql sql-server sql-server-2008 group-by sql-order-by


【解决方案1】:

您可以尝试使用CTE 和ROW_NUMBER。

类似

;WITH Vals AS (
    SELECT UserID, 
           DocumentID, 
           ROW_NUMBER() OVER(PARTITION BY UserID, DocumnentID ORDER BY CreatedDate DESC) RowID
    FROM MyTable
)
SELECT TOP 3 *
FROM Vals
WHERE UserID = 71
AND RowID = 1

【讨论】:

  • 我认为您的查询不会返回所需的 CreatedDate。如果我错了,请纠正我。
【解决方案2】:
SELECT TOP 3 UserId, DocumentId, MAX(CreatedDate)
FROM MyTable
WHERE UserId = 71
GROUP BY UserId, DocumentId
ORDER BY MAX(CreatedDate) DESC

【讨论】:

  • 快速问题:这在 MySQL 中不起作用,因为它在分组后进行排序(它会在没有错误的情况下执行,但它会产生可能是也可能不是“正确”的结果);有人可以确认这可以在 SQL Server 中工作,因此这两个引擎之间存在差异吗?
  • @user2426679 - 这对我使用 Sql Server 2016 确实有效。
【解决方案3】:
Select USERID,DOCUMENT ID 
FROM yourtable
QUALIFY ROW_NUMBER OVER(Partition by user id ORDER By document id Desc)<6

这适用于 Teradata。希望这也适用于 Sql Server,因为它主要是 ANSI SQL。

【讨论】:

  • 我不认为QUALIFY 是ANSI SQL。
  • select USERID,DOCUMENT ID,ROW_NUMBER OVER(Partition by user id ORDER By document id Desc) Rownum FROM yourtable with rownum
【解决方案4】:

你可以试试这个:

SELECT DISTINCT USERID, 
                DOCUMENTID, 
                MAX(CREATEDDATE) 
                  OVER ( 
                    PARTITION BY USERID, DOCUMENTID) CREATEDDATE 
FROM   MYTABLE 
WHERE  USERID = 71 

查看SQL Fiddle 上的工作示例。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2011-05-18
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2016-10-03
    相关资源
    最近更新 更多