Ответ 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
У меня есть таблица, в которой записаны записи о том, когда пользователь вошел в систему.
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..
Как создать запрос, который даст мне последнюю дату для каждого пользователя?
Обновление: Я забыл, что мне нужно иметь значение, которое сочетается с последней датой.
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
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
Чтобы получить всю строку, содержащую максимальную дату для пользователя:
select username, date, value
from tablename where (username, date) in (
select username, max(date) as date
from tablename
group by username
)
Я вижу, что большинство разработчиков используют встроенный запрос без учета его влияния на огромные данные.
Просто вы можете достичь этого:
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;
Этот должен дать вам правильный результат для вашего отредактированного вопроса.
Подзапрос гарантирует поиск только строк последней даты, а внешний 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
SELECT *
FROM MyTable T1
WHERE date = (
SELECT max(date)
FROM MyTable T2
WHERE T1.username=T2.username
)
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
Будет устранена проблема обновления. Он может работать не так хорошо на больших таблицах, даже с хорошей индексацией.
SELECT *
FROM ReportStatus c
inner join ( SELECT
MAX(Date) AS MaxDate
FROM ReportStatus ) m
on c.date = m.maxdate
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
Для Oracle сортирует результирующий набор в порядке убывания и берет первую запись, поэтому вы получите самую последнюю запись:
select * from mytable
where rownum = 1
order by date desc
Select * from table1 where lastest_date=(select Max(latest_date) from table1 where user=yourUserName)
Внутренний запрос вернет последнюю дату для текущего пользователя, внешний запрос будет вытаскивать все данные в соответствии с результатом внутреннего запроса.
Я использовал этот способ для записи последней записи для каждого пользователя, который у меня есть на моем столе. Это был запрос получить последнее место для продавца в последнее время, обнаруженное на устройствах 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
Моя небольшая компиляция
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
любые столбцы из отфильтрованных строкМинусы:
Вы должны использовать агрегатную функцию MAX и GROUP BY
SELECT username, MAX(date), value FROM tablename GROUP BY username, value
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
SELECT * FROM TABEL1 WHERE DATE= (SELECT MAX(CREATED_DATE) FROM TABEL1)
Это также должно работать, чтобы получить все последние записи для пользователей.
SELECT username, MAX(date) as Date, value
FROM MyTable
GROUP BY username, value