2015-01-16 6 views
0

Я создал этот код, чтобы вытащить билеты из нашей базы данных, а также вытащить последнюю дату записи и последнего пользователя билета. Он работает, за исключением того, что два человека (или более) создали заметку на последней дате (независимо от разницы во времени), она создаст несколько строк для каждого билета. Как это исправить? вот код:Только получить последнее время в SQL Server

Select distinct t.ticketID, 
    t.OpenDate, 
    c.categoryname, 
    s.statusname, 
    p.priorityname, 
    u.firstname, 
    u.lastname, 
    tu.firstname as 'tech_firstname', 
    tu.lastname as 'tech_lastname', 
    ltn.maxdate as 'last date', 
    ltu.firstname + ' ' + ltu.lastname as 'Last User' 

    from ticket t 
     left join category c on t.categoryid = c.categoryid 
     left join [status] s on t.statusid = s.statusid 
     left join [priority] p on t.priorityid = p.priorityid 
     left join [user] u on t.userid = u.userid 
     left join [user] tu on t.technicianid = tu.userid 
     left join ticketnote tn on t.ticketid = tn.ticketid 
     inner join (
      Select Max(TicketNoteDate) as MaxDate, max(cast(ticketnotedate as time)) as MaxTime, ticketid, userid 
      From ticketNote 
      group by ticketid, userid) ltn on tn.ticketid = ltn.ticketid and tn.ticketnotedate = ltn.maxdate and cast(tn.ticketnotedate as time) = ltn.maxtime 
     left join [user] ltu on ltn.userid = ltu.userid 

    where t.statusid = 1 
    and t.LocationID = 1 

    order by t.ticketid 
+0

Вам лучше показать некоторые данные образца. – dario

+1

google 'SQL SERVER ROW_NUMBER() Функция' –

+0

Вместо MAX() в вашем подзапросе используйте Row_Number или даже TOP 1. –

ответ

2

Как было предложено в комментариях, используйте row_number в вашем подзапрос, где вы получите значение maximum

 SELECT row_number() over 
      (partition by tiketid, userid 
      order by TicketNoteDate desc) as rn, 
      ticketid, 
      userid, 
      ticketnotedate 

, а затем join с внешним запросом с условием является rn=1

0

I переписал его, получив максимальную дату всех билетов, затем найдя все билеты с этой максимальной датой и заказом по времени, по убыванию и получению первой строки, а затем извлечению дополнительных данных (например, пользователя) для этого запись. У меня не было возможности проверить это, но здесь идет ...

Select distinct t.ticketID, 
    t.OpenDate, 
    c.categoryname, 
    s.statusname, 
    p.priorityname, 
    u.firstname, 
    u.lastname, 
    tu.firstname as 'tech_firstname', 
    tu.lastname as 'tech_lastname', 
    ltn.maxdate as 'last date', 
    ltu.firstname + ' ' + ltu.lastname as 'Last User' 

    from ticket t 
     left join category c on t.categoryid = c.categoryid 
     left join [status] s on t.statusid = s.statusid 
     left join [priority] p on t.priorityid = p.priorityid 
     left join [user] u on t.userid = u.userid 
     left join [user] tu on t.technicianid = tu.userid  
     inner join (
      select maxdate, maxtime, ticketid, userid, rownum from (
       select maxdate, maxtime, ticketid, userid, row_number() over (order by maxdate desc, maxtime desc) as rownum 
       from ticketnote tn, 
       (Select Max(TicketNoteDate) as MaxDate 
       From ticketNote) mx 
       where mx.maxdate = tn.ticketnotedate 
       ) x where x.rownum = 1 
     ) ltn 
     left join [user] ltu on ltn.userid = ltu.userid 

    where t.statusid = 1 
    and t.LocationID = 1 

    order by t.ticketid 
+0

Спасибо вам за помощь. Для моей собственной информации, почему я должен использовать rownum вместо max? Это просто конвенция? или есть технические причины? – djblois

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