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

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

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..

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

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

Ответ 1

select t.username, t.date, t.value
from MyTable t
inner join (
    select username, max(date) as MaxDate
    from MyTable
    group by username
) tm on t.username = tm.username and t.date = tm.MaxDate

Ответ 2

SQL Server 2005 и выше...

select * from (
    select
        username,
        date,
        value,
        row_number() over(partition by username order by date desc) as rn
    from
        yourtable
) t
where t.rn = 1

Ответ 3

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

select username, date, value
from tablename where (username, date) in (
    select username, max(date) as date
    from tablename
    group by username
)

Ответ 4

Я вижу, что большинство разработчиков используют встроенный запрос без учета его влияния на огромные данные.

Просто вы можете достичь этого:

SELECT a.username, a.date, a.value
FROM myTable a
LEFT OUTER JOIN myTable b
ON a.username = b.username 
AND a.date < b.date
WHERE b.username IS NULL
ORDER BY a.datedesc;

Ответ 5

Этот должен дать вам правильный результат для вашего отредактированного вопроса.

Подзапрос гарантирует поиск только строк последней даты, а внешний GROUP BY позаботится о связях. Если для одной и той же даты есть две записи для одной и той же даты, она вернет ту, которая имеет самый высокий value.

SELECT t.username, t.date, MAX( t.value ) value
FROM your_table t
JOIN (
       SELECT username, MAX( date ) date
       FROM your_table
       GROUP BY username
) x ON ( x.username = t.username AND x.date = t.date )
GROUP BY t.username, t.date

Ответ 6

SELECT *     
FROM MyTable T1    
WHERE date = (
   SELECT max(date)
   FROM MyTable T2
   WHERE T1.username=T2.username
)

Ответ 7

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

Будет устранена проблема обновления. Он может работать не так хорошо на больших таблицах, даже с хорошей индексацией.

Ответ 8

SELECT *
FROM ReportStatus c
inner join ( SELECT 
  MAX(Date) AS MaxDate
  FROM ReportStatus ) m
on  c.date = m.maxdate

Ответ 9

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

Ответ 10

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

select * from mytable
where rownum = 1
order by date desc

Ответ 11

Select * from table1 where lastest_date=(select Max(latest_date) from table1 where user=yourUserName)

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

Ответ 12

Я использовал этот способ для записи последней записи для каждого пользователя, который у меня есть на моем столе. Это был запрос получить последнее место для продавца в последнее время, обнаруженное на устройствах PDA.

CREATE FUNCTION dbo.UsersLocation()
RETURNS TABLE
AS
RETURN
Select GS.UserID, MAX(GS.UTCDateTime) 'LastDate'
From USERGPS GS
where year(GS.UTCDateTime) = YEAR(GETDATE()) 
Group By GS.UserID
GO
select  gs.UserID, sl.LastDate, gs.Latitude , gs.Longitude
        from USERGPS gs
        inner join USER s on gs.SalesManNo = s.SalesmanNo 
        inner join dbo.UsersLocation() sl on gs.UserID= sl.UserID and gs.UTCDateTime = sl.LastDate 
        order by LastDate desc

Ответ 13

Моя небольшая компиляция

  • 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 года.

Ответ 14

Вы должны использовать агрегатную функцию MAX и GROUP BY

SELECT username, MAX(date), value FROM tablename GROUP BY username, value

Ответ 15

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       

Ответ 16

SELECT * FROM TABEL1 WHERE DATE= (SELECT MAX(CREATED_DATE) FROM TABEL1)

Ответ 17

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

SELECT username, MAX(date) as Date, value
FROM MyTable
GROUP BY username, value