2

できるはずなのに脳が溶けてしまったようだ

データベースはポストグル

テーブル構造は単純で、重要な 4 つの列だけです。

場所、ユーザー、アクティビティ、日時

場所で並べ替え、発生した各アクティビティの最新の発生のみを出力する必要があります。どんな活動をするかは事前にわからない

何かのようなもの

場所 ユーザー アクティビティ DateTime
ロンドン フレッド A 08-29-2012
ロンドン フレッド B 08-27-2012
パリ ジョン A 2012 年 8 月 29 日
東京フレッドA 08-17-2012
東京ジェーンD 2012年8月29日

ありがとう

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;

これにより、ソートと個別の行への縮小が 1 つの操作で結合されます。この関連する回答の詳細、説明、およびベンチマーク。

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 に答える