2

我应该能够做到这一点,但大脑似乎已经融化了

数据库是postgres

表结构很简单,只有四列很重要:

位置、用户、活动、日期时间

我需要按位置排序并仅输出已发生的每个活动的最新事件。事先不知道有什么活动

就像是

位置用户活动日期时间
伦敦弗雷德 A 08-29-2012
伦敦弗雷德 B 08-27-2012
巴黎约翰 A 08-29-2012
东京弗雷德 A 08-17-2012
东京简 D 08-29-2012

谢谢大家

4

4 回答 4

4

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);
于 2012-08-29T23:33:24.003 回答
2
SELECT * FROM table JOIN (
  SELECT Activity, Location, Max(DateTime) DateTime FROM table
  GROUP BY Activity, Location
  ) m USING (Activity, Location, DateTime)

最好在不完全理解您的问题的情况下回答。

于 2012-08-29T23:10:18.967 回答
0
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
于 2012-08-29T23:10:11.163 回答
0
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
于 2012-08-29T23:16:51.877 回答