SQL - Выбор Top 1 с Сортировать по?

голоса
0

Эта проблема была решена. Заявление было в другой части хранимой процедуры.

Хранимая процедура я пишу не позволит мне сделать это:

 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.

Что я делаю не так?

[Править] Там нет группы по утверждению здесь. 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
Задан 19/05/2009 в 11:58
источник пользователем
На других языках...                            


8 ответов

голоса
1

Какую версию SQL вы используете? Он отлично работает для меня на сервере MS SQL Server 2005 (ionce исправить декларацию).

Ответил 19/05/2009 в 12:04
источник пользователем

голоса
0

Попробуйте ВЫБЕРИТЕ @dtLatestDate = TOP 1 date_build ...

Ответил 19/05/2009 в 12:05
источник пользователем

голоса
1

Честно единственное , что я могу видеть , не так, что @dtTopDate = / = @dtLatestDate Кроме того, нет GROUP BY пункта в вашем SQL заявление.

Я просто побежал это и все работало нормально.

declare @OrderDate datetime

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

SELECT @OrderDate
Ответил 19/05/2009 в 12:05
источник пользователем

голоса
1

Попробуйте квалифицируя столбцы правильно, чтобы избежать каких-либо неясностей или проблемы схемы х-баз данных

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

Или псевдоним IT

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
Ответил 19/05/2009 в 12:11
источник пользователем

голоса
2

Это работает для меня, но я не уверен, если это то, что вы пытаетесь сделать б / с вашим примером имеют некоторые ошибки.

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
Ответил 19/05/2009 в 12:16
источник пользователем

голоса
1

Проблема заключалась в другой части хранимой процедуры. Я использовал COUNT (*) в другом месте и это потребовало группу,. Спасибо за помощь.

Ответил 19/05/2009 в 12:27
источник пользователем

голоса
2

Вместо того, чтобы Выбор 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 
Ответил 19/05/2009 в 13:01
источник пользователем

голоса
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;
Ответил 19/05/2009 в 13:13
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more