【问题标题】:SQL Server TSQL equivalent to 'MySQL Limit'? [duplicate]SQL Server TSQL 相当于“MySQL 限制”? [复制]
【发布时间】:2013-02-10 04:26:02
【问题描述】:

我知道 MySQL 有 limit 命令,但不知道在 SQL server 2008 中应该使用什么命令?

我需要选择 clientId 和每次取货的最后一天,大多数客户都有多个取货(取货表中有 65 000 + 条记录)。

select  P.ClientID,LastName+' '+FirsName as Name , Adress,p.PickupDate
from Pickup P,Clients C
where P.ClientID= C.ClientID
order by PickupDate desc limit 1


throwing error *Msg 102, Level 15, State 1, Line 4
Incorrect syntax near 'limit'.*
because **LIMIT** is not key word in SQL server

【问题讨论】:

标签: sql sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

limit命令在sql server中是top

select top 1 P.ClientID
   ,LastName+' '+FirsName as Name 
   ,Adress
   ,p.PickupDate
from Pickup P
join Clients C on P.ClientID= C.ClientID
order by PickupDate desc 

根据海报的说明 - 这甚至不是最高/限制问题。这是一个简单的 group by 语句。

select P.ClientID
   ,LastName+' '+FirsName as Name 
   ,Adress
   ,max(p.PickupDate)
from Pickup P
join Clients C on P.ClientID= C.ClientID
group by p.clientid, lastname + ' ' + firsname,adress

【讨论】:

  • 这是不对的,因为它只返回最后一条记录,但我需要返回表中每个 clientID 的最后一条记录
  • 大声笑 - 这是你在上面的要求中指定的。它可以根据您的意图进行修改(我将编辑为答案)。
  • 不可能!就这么简单?真的吗?我几乎花了一天的时间来做这件事。它只是简单地加入 MAX 功能。谢谢 !! @mson
  • 我觉得有趣的是 4 个家伙甚至没有阅读问题并试图关闭你的问题。
【解决方案2】:

试试这个

select P.ClientID, LastName+' '+FirsName as 'Name', Adress, max(p.PickupDate)
from Pickup P,Clients C
where P.ClientID= C.ClientID
GROUP BY P.ClientID, Adress, LastName+' '+FirsName
order by PickupDate desc

Fiddle

【讨论】:

  • 我只需要每个 ClientD 的最后一个 PickupDate,您的查询将列出每个 clientID 的所有记录。这是我的原始查询,但没有限制 1 :)
  • 检查编辑。希望对您有所帮助
【解决方案3】:

这通常使用windowing functions 完成(2012 年之前):

;WITH Data
AS
    (
    SELECT P.ClientID
        , LastName + ' ' + FirsName as Name
        , Address
        , PickupDate
        , ROW_NUMBER() OVER(PARTITION BY P.ClientID ORDER BY PickupDate DESC)
            AS [Entry #]
    FROM Pickup P
    JOIN Clients C
        ON P.ClientID= C.ClientID
    )
SELECT *
FROM Data
WHERE [Entry #] = 1
ORDER BY PickupDate DESC

请参阅 this blog post 以了解该技术的一些良好改进(以避免扫描不必要的行)。

【讨论】:

  • Msg 4108, Level 15, State 1, Line 9 窗口函数只能出现在 SELECT 或 ORDER BY 子句中。
  • @AndreyIvanov - 抱歉,忘记了 CTE。
  • 谢谢它的工作!但是我在哪里可以找到可以帮助我理解您的查询的东西?我很难过它有效,但我想知道如何:)
  • 有没有办法让它变得更简单?因为我需要基于此查询的 wright 程序,如果他/她超过 2 个月没有取货,它将更改客户的 ststusId。
猜你喜欢
  • 2011-03-08
  • 2010-10-25
  • 2011-03-27
  • 2010-09-27
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多