在SQL中如何将我的Row_Number()添加到from子句中的当前子查询?

时间:2014-03-19 16:47:52

标签: sql sql-server tsql

正如上面所述,我试图将这个Row_Number()查询作为子句中的from子句:

SELECT *
FROM (
     SELECT *, ROW_NUMBER() OVER (ORDER BY CaseID) AS RowNum
     FROM T.dbo.CompletedCase
     ) AS MyDerivedTable
WHERE MyDerivedTable.RowNum BETWEEN 0 AND 25

这是我试图将其置于

中的查询
SELECT DISTINCT c.UserId, (u.FirstName + ' ' + u.LastName) AS [UserName], Count(c.UserId +c.CaseId+c.LineNumber) AS [CompletedCase]
FROM T.dbo.CompletedCase c join T.dbo.User u on c.UserId = u.UserID
WHERE c.PrintDateTime >= '2014-01-27 7:00' AND c.PrintDateTime <= '2014-01-27 17:00'
Group By u.FirstName, u.LastName, c.UserId
Order By [UserName]

我已经看到不同的人如何对他们应用类似的东西,但我不知道如何在from子句中应用它。如果你要解释一些答案,将不胜感激!如果有更好的方法从SELECT子句中执行此操作,那么我将尝试它。对我来说,放入FROM子句是有意义的,因为它是从中拉出行的地方。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

你应该可以做同样的事情(虽然我无法想象你想要完成的事情):

Select  *
From (
        SELECT DISTINCT ROW_NUMBER() Over(Order By c.UserId) rn, c.UserId, (u.FirstName + ' ' + u.LastName) AS [UserName], Count(c.UserId +c.CaseId+c.LineNumber) AS [CompletedCase]
        FROM T.dbo.CompletedCase c join T.dbo.User u on c.UserId = u.UserID
        WHERE c.PrintDateTime >= '2014-01-27 7:00' AND c.PrintDateTime <= '2014-01-27 17:00'
        Group By u.FirstName, u.LastName, c.UserId
    ) x
Where   x.rn Between 0 and 25
Order By [UserName]

我个人喜欢用CTE做这种事情:

;with cte as
(
    SELECT  DISTINCT ROW_NUMBER() Over(Order By c.UserId) rn
            ,c.UserId
            ,(u.FirstName + ' ' + u.LastName) AS [UserName]
            ,Count(c.UserId +c.CaseId+c.LineNumber) AS [CompletedCase]
    FROM T.dbo.CompletedCase c
    join T.dbo.User u
        on c.UserId = u.UserID
    WHERE c.PrintDateTime >= '2014-01-27 7:00' AND c.PrintDateTime <= '2014-01-27 17:00'
    Group By u.FirstName, u.LastName, c.UserId
)
Select  UserId
        ,UserName
        ,CompletedCase
From    cte
Where   rn Between 0 And 25
Order By [UserName]

但是,有点像你只想要前25行,所以为什么不呢:

SELECT DISTINCT Top 25, c.UserId, (u.FirstName + ' ' + u.LastName) AS [UserName], Count(c.UserId +c.CaseId+c.LineNumber) AS [CompletedCase]
FROM T.dbo.CompletedCase c join T.dbo.User u on c.UserId = u.UserID
WHERE c.PrintDateTime >= '2014-01-27 7:00' AND c.PrintDateTime <= '2014-01-27 17:00'
Group By u.FirstName, u.LastName, c.UserId
Order By [UserName]