SQL - 使用Order by选择Top 1?

时间:2009-05-19 12:58:38

标签: sql

这已经解决了。该声明是存储过程的另一部分。

我写的存储过程不允许我这样做:

 declare @dtTopDate datetime
  select top 1 @dtTopDate  = date_build
    from database..table
   where database..table.parent = @Parent
     and database..table.child = @Child
   order by date_build desc

给我这个错误:

  

列“database..table.date_build”是   在ORDER BY子句中无效,因为   它不包含在任何一个中   聚合函数或GROUP BY   子句。

我做错了什么?

[编辑]这里没有group by语句。 SQL2005。

以下是更多背景信息:

if @Notify = 0
begin
     declare @dtTopDate datetime
      select top 1 @dtTopDate  = date_build
        from database..table
       where database..table.parent = @Parent
         and database..table.child = @Child
       order by date_build desc

      insert 
        into database2..table
             (parent, child, notification_date, change_date)
      values (@Parent, @Child, @dtTopDate, getdate())
     return 
end

8 个答案:

答案 0 :(得分:2)

这适用于我,但我不确定这是否是你要做的事情b / c你的例子有一些错误。

use Test
go
CREATE TABLE [dbo].[MyTable]
(
    [MyTableId] [uniqueidentifier] NOT NULL,
    [MyDate] [datetime] NOT NULL,
    CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED([MyTableId] ASC,[MyDate] ASC)
)
GO
CREATE PROCEDURE ProcTopDate
(
    @MyDate datetime OUT
)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT TOP 1
        @MyDate = [MyDate]
    FROM [Test].[dbo].[MyTable]
    order by MyDate
END
GO

insert into MyTable(MyTableId, MyDate)
values(newid(), getdate())
go

declare @MyDate datetime
exec ProcTopDate @MyDate OUT
print @MyDate

答案 1 :(得分:2)

而不是SELECT TOP 1 ... ORDER BY ...

为什么不尝试SELECT MAX(..

DECLARE @dtTopDate datetime
SELECT @dtTopDate = MAX(date_build)
 from database..table 
 where database..table.parent = @Parent
 and database..table.child = @Child 

答案 2 :(得分:1)

您使用的是哪个版本的SQL?它在MS SQL Server 2005上运行正常(我修复了声明)。

答案 3 :(得分:1)

老实说,我唯一看错的是@dtTopDate = / = @dtLatestDate 除此之外,SQL语句中没有 GROUP BY 子句。

我刚刚运行它并且运行正常。

declare @OrderDate datetime

select top 1 @OrderDate = OrderDate
from Orders
where Orders.CustomerID = 'ALFKI'
 and Orders.EmployeeID = 4
order by OrderDate desc

SELECT @OrderDate

答案 4 :(得分:1)

尝试正确限定列以避免任何歧义或x-database架构问题

declare @dtTopDate datetime

select top 1 
    @dtTopDate  = [database]..[table].date_build
FROM
    [database]..[table]
where
    [database]..[table].parent = @Parent
    and [database]..[table].child = @Child
order by
    [database]..[table].date_build desc

或别名

declare @dtTopDate datetime

select top 1
    @dtTopDate  = foo.date_build
FROM
    [database]..[table] foo
where
    foo.parent = @Parent
    and foo.child = @Child
order by
    foo.date_build desc

答案 5 :(得分:1)

问题出在存储过程的另一部分。我在其他地方使用了一个计数(*),它需要一个分组。谢谢你的帮助。

答案 6 :(得分:0)

尝试SELECT @dtLatestDate = TOP 1 date_build ...

答案 7 :(得分:0)

如果你想变得非常棘手,在T-SQL中你可以尝试使用row_number()方法和内部选择:

select * from
(
    select 
        db.groupId
        , db.date_build
        , date_build_rank = row_number() over ( partition by db.groupId order by db.date_build desc)
    from
        #date_build_tbl db
) as a 
where a.date_build_rank < 2;