我应该能够做到这一点,但大脑似乎已经融化了
数据库是postgres
表结构很简单,只有四列很重要:
位置、用户、活动、日期时间
我需要按位置排序并仅输出已发生的每个活动的最新事件。事先不知道有什么活动
就像是
位置用户活动日期时间 伦敦弗雷德 A 08-29-2012 伦敦弗雷德 B 08-27-2012 巴黎约翰 A 08-29-2012 东京弗雷德 A 08-17-2012 东京简 D 08-29-2012
谢谢大家
我应该能够做到这一点,但大脑似乎已经融化了
数据库是postgres
表结构很简单,只有四列很重要:
位置、用户、活动、日期时间
我需要按位置排序并仅输出已发生的每个活动的最新事件。事先不知道有什么活动
就像是
位置用户活动日期时间 伦敦弗雷德 A 08-29-2012 伦敦弗雷德 B 08-27-2012 巴黎约翰 A 08-29-2012 东京弗雷德 A 08-17-2012 东京简 D 08-29-2012
谢谢大家
PostgreSQL 中最快的方法可能是DISTINCT ON
:
SELECT DISTINCT ON (location, activity)
location, activity, datetime, usr
FROM tbl
ORDER BY location, activity, datetime DESC, usr; -- usr only to break ties
带有位置参数的简写形式:
SELECT DISTINCT ON (1 ,2)
location, activity, datetime, usr
FROM tbl
ORDER BY 1, 2, 3 DESC, 4;
这在一个操作中结合了排序和归约到不同的行。此相关答案中的更多详细信息、解释和基准。
user
是保留字。实际上不要将其用作列名。我用usr
.
如果性能应该是至关重要的,那么像下面这样的索引将会有所作为:
CREATE INDEX tbl_multi_idx ON tbl (location, activity, datetime DESC, usr);
SELECT * FROM table JOIN (
SELECT Activity, Location, Max(DateTime) DateTime FROM table
GROUP BY Activity, Location
) m USING (Activity, Location, DateTime)
最好在不完全理解您的问题的情况下回答。
SELECT
Location,
User
Activity
DateTime
From
myTable a
INNER JOIN
(SELECT Location, User, Max(DateTime) as DateTime FROM myTable GROUP BY Location, User) b
ON a.Location = b.Location AND a.User = b.User AND a.DateTime = b.DateTime
select t1.location, t1.user, m.activity, m.datetime
from table1 t1 inner join
(select activity, max(datetime) datetime from table1 group by activity) m
on t1.activity = m.activity and t1.datetime = m.datetime
order by t1.location asc