SQL - Seleção Top 1 com ORDER BY?

votos
0

Isto foi resolvido. A declaração foi em outra parte do procedimento armazenado.

O procedimento armazenado eu estou escrevendo não me permite fazer isso:

 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

me dá esse erro:

Coluna database..table.date_build é inválida na cláusula ORDER BY porque não está contida em uma função de agregação ou a cláusula GROUP BY.

O que estou fazendo de errado?

[Editar] Não existe nenhum grupo com a declaração aqui. SQL2005.

Aqui está mais algumas contexto:

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
Publicado 19/05/2009 em 13:58
fonte usuário
Em outras línguas...                            


8 respostas

votos
2

Em vez de SELECT TOP 1 ... ORDER BY ...

Por que não tentar SELECT MAX (..

DECLARE @dtTopDate datetime
SELECT @dtTopDate = MAX(date_build)
 from database..table 
 where database..table.parent = @Parent
 and database..table.child = @Child 
Respondeu 19/05/2009 em 15:01
fonte usuário

votos
2

Isso funciona para mim, mas eu não tenho certeza se é isso que você está tentando fazer b / c seu exemplo tem alguns erros.

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
Respondeu 19/05/2009 em 14:16
fonte usuário

votos
1

O problema estava em outra parte do procedimento armazenado. Eu estava usando uma contagem (*) em outro lugar e foi necessário um grupo de. Obrigado pela ajuda.

Respondeu 19/05/2009 em 14:27
fonte usuário

votos
1

Tente qualificar as colunas corretamente para evitar quaisquer ambiguidades ou questão esquema de banco de dados x

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

Ou o alias

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
Respondeu 19/05/2009 em 14:11
fonte usuário

votos
1

Honestamente, a única coisa que eu posso ver errado é que @dtTopDate = / = @dtLatestDate Além disso, não há nenhum GROUP BY cláusula em sua instrução SQL.

Eu corri isso e funcionou muito bem.

declare @OrderDate datetime

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

SELECT @OrderDate
Respondeu 19/05/2009 em 14:05
fonte usuário

votos
1

Qual versão do SQL você está usando? Ele funciona muito bem para mim no MS SQL Server 2005 (ionce para corrigir a declaração).

Respondeu 19/05/2009 em 14:04
fonte usuário

votos
0

se você quiser ficar realmente complicado, em T-SQL você pode tentar usar o método row_number () e um SELECT interna:

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;
Respondeu 19/05/2009 em 15:13
fonte usuário

votos
0

Tente SELECIONAR @dtLatestDate = TOP 1 date_build ...

Respondeu 19/05/2009 em 14:05
fonte usuário

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