2013-02-25 5 views
1

Я знаю, что MySQL имеет команду ограничения, но я не знаю, какую команду использовать в SQL Server 2008?SQL Server TSQL эквивалентен «MySQL Limit»?

Мне нужно выбрать 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 
+1

я знаю, именно поэтому я прошу – Andrey

+0

Это уже здесь ответили >> http://stackoverflow.com/questions/9013177/mysql-limit-clause-equivalent-for-sql-server – mockaroodev

ответ

3

предел команда топ в SQL сервере

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 

в разъяснении плаката - это даже не топ/предел вопрос. это простая заявка.

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 
+0

Неправильно, потому что он возвращает только последнюю запись, но мне нужно вернуть последнюю запись для каждого идентификатора клиента в таблице – Andrey

+2

lol - это то, что вы указали в требовании выше. он может быть изменен для того, что вы намеревались (что я отредактирую в ответ). – mson

+0

нет! это было так просто? действительно? я трачу почти день, чтобы сделать это. и он просто соединяется с функцией MAX. Спасибо !! @mson – Andrey

1

Это обычно делается (до 2012) с использованием windowing functions:

;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 для некоторых хороших усовершенствований техники (чтобы избежать сканирования ненужных строк).

+0

Msg 4108, Уровень 15, состояние 1, строка 9 Оконные функции могут отображаться только в предложениях SELECT или ORDER BY. – Andrey

+0

@ AndreyIvanov - извинения, забыл CTE. –

+0

Thanx это работает! но где я могу найти что-то, что может помочь мне понять ваш запрос? как мне грустно это работает, но я хочу знать, как :) – Andrey

1

Попробуйте

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

+0

Мне нужно только последнее PickupDate для каждого ClientD, в вашем запросе будут перечислены все записи для каждого идентификатора клиента. Это мой первоначальный запрос, но без ограничений 1 :) – Andrey

+0

Отредактируйте .. Надеюсь, это поможет – Meherzad

Смежные вопросы