2013-05-09 4 views
1

Я пытаюсь создать запрос, в котором будет отображаться только одна запись клиента, но отображаемая запись должна быть последней записью, добавленной в базу данных этого клиента ... Я могу использовать MAX (дата), чтобы получить последнюю дату. Причина этого заключается в том, что я создаю Gridview, где будет отображаться одна запись каждого клиента (последняя добавленная запись), после чего у них есть возможность просмотреть историю. Ни одна вторая строка того же клиента не должно быть видно ....Выберите Макс. Дату каждого клиента

это мой запрос:

SELECT Client, Model, SerialNo, Dep, Level, Colour, Status 
FROM TonerRequest 
WHERE Status = 'Open' 

Может кто-нибудь предложить, пожалуйста, как я могу это сделать? или где-нибудь, где я могу прочитать, как это сделать?

ответ

3

Вы можете использовать row_number() выбрать последнюю строку для каждого клиента:

SELECT * 
FROM (
     SELECT ROW_NUMBER() OVER (
        PARTITION BY Client 
        ORDER BY Date DESC) as rn 
     ,  Client 
     ,  Model 
     ,  SerialNo 
     ,  ... 
     FROM TonerRequest 
     WHERE Status = 'Open' 
     ) SubQueryALias 
WHERE rn = 1 
+0

почему это получило нижний предел? он делает то, что требуется – Ric

+0

Он возвращает правильные строки и данные, но дает столбец ekstra, который не должен отображаться ..... – Kerieks

+0

Вы можете заменить 'select *' только на список нужных столбцов – Andomar

0

Попробуйте это:

SELECT TOP 1 Client, Model, SerialNo, Dep, Level, Colour, Status FROM TonerRequest WHERE Status = 'Open' ORDER BY Date DESC 
+1

Это будет отображаться только одна запись, а не только одна запись на одного клиента, как ОП просит – Andomar

+1

не будут работать , Потому что вы просто получаете последнюю информацию, независимо от Клиента. – Yahya

+0

OP сказал: «Где одна запись каждого клиента» – Yahya

1

Предположим, что клиент ваш ПК, вы можете сделать такой подход, как этот

Select * from TonerRequest 
where Status = 'Open' 
and date in (select max(date) from TonerRequest group by Client) 
+1

+1 Это будет работать, даже если Клиент не является ПК. Он не будет разорвать связи (клиент с двумя строками с той же датой.) – Andomar

+0

Да, вы правы. Но, на мой взгляд, лучше использовать 'group by' в' PK'. Это может помочь вам избежать нежелательной ошибки –

+0

Это все еще возвращает все строки .... – Kerieks

1

Что-то вроде этого:

SELECT * FROM TonerRequest TR, 
(Max(YourDateColumn) MaxDate, Client 
FROM TonerRequest 
WHERE Status = 'Open' 
GROUP BY Client) TRSub 
WHERE TR.Client == TRSub.Client 
AND TR.YourDateColum == TRSub.MaxDate 
+0

Ударьте мне, у меня был практически тот же запрос в моей голове;) – nakchak

1

Я бы использовал самоподключение (INNER JOIN в ту же таблицу), чтобы решить эту проблему.

SELECT DISTINCT 
    a.Client 
    ,a.Model 
    ,a.SerialNo 
    ,a.Dep 
    ,a.Level 
    ,a.Colour 
    ,a.Status 
    FROM TonerRequest AS a 
    INNER JOIN 
    (SELECT 
     MAX([Date]) OVER (PARTITION BY Client) AS 'Date' 
     ,Client 
     ,Status 
     FROM TonerRequest 
     WHERE Status = 'Open' 
    ) AS b 
    ON a.Client = b.Client 
    AND a.[Date] = b.[Date] 
    AND a.Status = b.Status 
; 

а является то, что ВЫБРАТЬ положение будет действовать против, в то время как б будет ограничить результаты, данные выбрать из ЕКА.

я собрал образец на SQL Fiddle: http://sqlfiddle.com/#!6/ba532/6

Смотрите здесь для более на себя присоединяется: http://blog.sqlauthority.com/2010/07/08/sql-server-the-self-join-inner-join-and-outer-join/

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