как запросить sql для последней даты записи для каждого пользователя - PullRequest
174 голосов
/ 09 марта 2010

У меня есть таблица, которая представляет собой набор записей о том, когда пользователь вошел в систему.

username, date,      value
--------------------------
brad,     1/2/2010,  1.1
fred,     1/3/2010,  1.0
bob,      8/4/2009,  1.5
brad,     2/2/2010,  1.2
fred,     12/2/2009, 1.3

etc..

Как мне создать запрос, который даст мне самую последнюю дату для каждого пользователя?

Обновление: Я забыл, что мне нужно иметь значение, соответствующее самой последней дате.

Ответы [ 21 ]

0 голосов
/ 05 февраля 2016

Это также должно работать для получения всех последних записей для пользователей.

SELECT username, MAX(date) as Date, value
FROM MyTable
GROUP BY username, value
0 голосов
/ 09 марта 2010
SELECT Username, date, value
 from MyTable mt
 inner join (select username, max(date) date
              from MyTable
              group by username) sub
  on sub.username = mt.username
   and sub.date = mt.date

Решит обновленную проблему. Это может не очень хорошо работать на больших таблицах, даже при хорошей индексации.

0 голосов
/ 07 августа 2018

Я сделал что-то для своего приложения:

Ниже приведен запрос:

select distinct i.userId,i.statusCheck, l.userName from internetstatus 
as i inner join login as l on i.userID=l.userID 
where nowtime in((select max(nowtime) from InternetStatus group by userID));    
0 голосов
/ 18 декабря 2012
SELECT *
FROM ReportStatus c
inner join ( SELECT 
  MAX(Date) AS MaxDate
  FROM ReportStatus ) m
on  c.date = m.maxdate
0 голосов
/ 29 мая 2017
SELECT * FROM TABEL1 WHERE DATE= (SELECT MAX(CREATED_DATE) FROM TABEL1)
0 голосов
/ 23 августа 2017

Мой маленький сборник

  • self join лучше, чем вложенный select
  • но group by не дает вам primary key, что предпочтительно для join
  • этот ключ может быть дан partition by вместе с first_value ( docs )

Итак, вот запрос:

select
 t.*
from 
 Table t inner join (
  select distinct first_value(ID) over(partition by GroupColumn order by DateColumn desc) as ID
  from Table
  where FilterColumn = 'value'
 ) j on t.ID = j.ID

Плюсы:

  • Фильтрация данных с помощью оператора where по любому столбцу
  • select любые столбцы из отфильтрованных строк

Минусы:

  • Требуется MS SQL Server, начиная с 2012 года.
0 голосов
/ 03 декабря 2014
SELECT t1.username, t1.date, value
FROM MyTable as t1
INNER JOIN (SELECT username, MAX(date)
            FROM MyTable
            GROUP BY username) as t2 ON  t2.username = t1.username AND t2.date = t1.date
0 голосов
/ 20 августа 2018

Это похоже на один из ответов выше, но, на мой взгляд, это намного проще и аккуратнее. Кроме того, показывает хорошее использование для заявления перекрестного применения. Для SQL Server 2005 и выше ...

select
    a.username,
    a.date,
    a.value,
from yourtable a
cross apply (select max(date) 'maxdate' from yourtable a1 where a.username=a1.username) b
where a.date=b.maxdate
0 голосов
/ 05 марта 2015

Для Oracle сортирует набор результатов в порядке убывания и принимает первую запись, поэтому вы получите самую последнюю запись:

select * from mytable
where rownum = 1
order by date desc
0 голосов
/ 27 июля 2015
SELECT DISTINCT Username, Dates,value 
FROM TableName
WHERE  Dates IN (SELECT  MAX(Dates) FROM TableName GROUP BY Username)


Username    Dates       value
bob         2010-02-02  1.2       
brad        2010-01-02  1.1       
fred        2010-01-03  1.0       
...