SQL возврат самой последней даты и отметки времени - PullRequest
0 голосов
/ 24 января 2020

У меня есть данные ниже, и мне нужно увидеть самую последнюю дату, когда действие равно 'ИСПОЛЬЗОВАНО':

CAT STAMP               ACTION
A   05/12/2019 00:13    USED
A   05/12/2019 07:56    USED
A   05/12/2019 09:05    NEW
A   05/12/2019 10:46    NEW
B   20/12/2019 20:50    USED
B   13/01/2020 14:50    USED
B   10/01/2020 22:39    NEW
B   05/12/2019 12:04    NEW

Для вышеупомянутого мне нужно будет вернуть:

A   05/12/2019 07:56    USED
B   13/01/2020 14:50    USED

Для каждого «кота» может быть сотни записей на каждый день, и нужно оглянуться назад на несколько лет, возвращая только самую последнюю запись. Пробовали функцию MAX, но не думаете, что она работает из-за формата даты.

Ответы [ 4 ]

1 голос
/ 24 января 2020

Вы можете использовать подзапрос:

select t.*
from table t 
where t.action = 'used' and
      t.stamp = (select max(t2.stamp) from table t1 where t1.stamp = t.stamp)
0 голосов
/ 24 января 2020

Это будет:

select t.*
from t 
where t.stamp = (select min(t2.stamp)
                 from table t2
                 where t2.cat = t.cat and t2.action = 'used' 
                );

Обратите внимание, что фильтрация находится в подзапросе.

Или, возможно, более просто, как:

select t.cat, max(t.stamp)
from t
where t.action = 'used'
group by t.cat;

Однако это делает не позволяет вам возвращать другие столбцы.

0 голосов
/ 24 января 2020

Звучит так, как будто штамп хранится в виде varchar вместо даты и времени. Попробуйте CAST сначала.

SELECT cat, MAX(CAST stamp AS DateTime) as MxDate, 'used' as Action
FROM mytable
WHERE Action = 'used'
GROUP BY cat
0 голосов
/ 24 января 2020

Один из способов сделать это - отфильтровать с помощью коррелированного подзапроса:

select t.*
from mytable t
where 
    t.action = 'USED'
    and stamp = (
        select max(t1.stamp) 
        from mtable t1 
        where t1.cat = t.cat and t1.action = t.action
    )

Другим типичным решением является шаблон anti- left join:

select t.*
from mytable t
left join mytable t1
    on  t1.cat = t.cat
    and t1.action = t.action
    and t1.stamp > t.stamp
where t.action = 'USED' and t1.cat is null

Оба решения предполагают что stamp хранится в date -подобном типе данных. Если это не так, вам нужен дополнительный шаг для преобразования строки в дату.

...