Как вернуть самый последний LogTime для каждого SKU - PullRequest
1 голос
/ 11 июля 2019

Это мой текущий запрос:

EventID Sku         User1           LogTime
3510    02821-99-0  Item Inducted   2019-07-08
3510    02821-99-0  Item Inducted   2019-07-06
3510    12573-88-L  Item Inducted   2019-07-08
3510    12573-88-L  Item Inducted   2019-07-07
3510    12948-96-M  Item Inducted   2019-07-06
3510    12948-96-M  Item Inducted   2019-07-05
3510    12948-96-M  Item Inducted   2019-07-05

Что я хочу: (последний идентификатор события 3510 для каждого SKU)

EventID Sku         User1           LogTime
3510    02821-99-0  Item Inducted   2019-07-08
3510    12573-88-L  Item Inducted   2019-07-08
3510    12948-96-M  Item Inducted   2019-07-06

Я пытался использоватьМАКС. ФУНКЦИЯ, но мой запрос не удался.

Ниже приведен запрос, которым я сейчас пользуюсь:

select
tl.EventID,
tl.Sku,
tl.User1,
--MAX(tl.LogTime) as 'LogTime'
tl.LogTime

from dmhost.tblTransactionLog tl

where tl.logTime between '7/5/2019' and '7/9/2019'
and tl.sku not like 'NULL'
and tl.sku <> ''
and tl.sku not like 'Unknown'
and tl.EventID like '3510'

--group by tl.Sku,tl.EventID
order by tl.Sku

Я прокомментировал то, что попробовал.Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 июля 2019

Это будет работать в SQL Server и MySQL.(https://www.db -fiddle.com / f / kDhqfwDG2bUcqm5GKUbdj3 / 0 )

Сначала получите максимальное значение LogTime для каждой комбинации EventID и Sku, а затем присоединитесь к ней из tblTransactionLog.

SELECT     tl.EventID
         , tl.Sku
         , tl.User1
         , tl.LogTime
FROM       dmhost.tblTransactionLog tl
INNER JOIN (
               SELECT EventID
                    , Sku
                    , MAX(LogTime) AS MaxLogTime
               FROM   dmhost.tblTransactionLog
               WHERE  LogTime BETWEEN '7/5/2019' AND '7/9/2019'
           GROUP BY   EventID, Sku
           ) AS tmax ON tl.EventID = tmax.EventID
                        AND tl.Sku = tmax.Sku
                        AND tl.LogTime = tmax.MaxLogTime
WHERE    tl.LogTime BETWEEN '7/5/2019' AND '7/9/2019'
0 голосов
/ 11 июля 2019

Я бы предложил написать этот запрос как:

select tl.EventID, tl.Sku, tl.User1, tl.LogTime
from (select tl.*,
             row_number() over (partition by tl.EventID, tl.sku order by tl.logTime desc) as seqnum
      from dmhost.tblTransactionLog tl
      where tl.logTime >= '2019-07-05' and
            tl.logtime < '2019-07-09' and
            tl.sku not in ('NULL', '', 'Unknown') and
            tl.EventID like 3510
     ) tl
where seqnum = 1
order by tl.Sku;

Примечания:

  • Используйте правильные форматы даты / времени, чтобы они были однозначными. Я предпочитаю дефисы (стандарт ISO 8601). SQL Server предпочитает значения без дефисов.
  • Ваша строка comparisons on sku is simplified using NOT IN`.
  • EventID выглядит как число, поэтому я предполагаю, что это так, и отбросил кавычки для сравнения и изменил LIKE на =.
  • Аарон Бертран имеет хорошее объяснение того, почему вы не хотите использовать BETWEEN со значениями даты / времени.
0 голосов
/ 11 июля 2019

Вы можете использовать аналитическую функцию окна row_number() в отношении разбиения по столбцам EventID и Sku и из-за взятия последней LogTime по order by LogTime desc:

select q.EventID, q.Sku, q.User1, q.LogTime
  from
  (
   select tl.EventID, tl.Sku, tl.User1, t1.LogTime
          row_number() over (partition by tl.EventID, t1.Sku order by tl.LogTime desc) as rn
     from dmhost.tblTransactionLog tl    
    where tl.logTime between '2019-07-05' and '2019-07-09'
      and tl.sku not like 'NULL'
      and tl.sku <> ''
      and tl.sku not like 'Unknown'
      and tl.EventID like '3510'
  ) q
where rn = 1
order by q.Sku
...