我有一個看起來像這樣的表:
CREATE TABLE UTable (
m_id TEXT PRIMARY KEY,
u1 TEXT,
u2 TEXT,
u3 TEXT,
-- other stuff, as well as
gid INTEGER,
gt TEXT,
d TEXT,
timestamp TIMESTAMP
);
CREATE TABLE OTable (
gid INTEGER,
gt TEXT,
d TEXT,
-- other stuff, such as
n INTEGER
);
CREATE UNIQUE INDEX OTable_idx ON OTable (gid, gt, d);
對于OTable匹配條件(的固定值gid, gt)的每條記錄,我想UTable用最小時間戳加入相應的記錄。
吸引我的是,在我的最終結果中,我不關心時間戳,我顯然需要分組d(因為gid并且gt是固定的),但我確實需要u1, u2, u3從選定的記錄中提取。
SELECT o.d, u.u1, u.u2, u.u3, o.n
FROM UTable u
INNER JOIN OTable o
ON u.gid = o.gid AND u.gt = o.gt AND u.d = o.d
WHERE u.gid = 3 AND u.gt = 'dog night'
GROUP BY u.d
-- and u.timestamp is the minimum for each group
;
我認為我的第一步應該只是做選擇UTable,然后我可以加入反對它。但即使在那里,我也有點困惑。
SELECT u.d, u.u1, u.u2, u.u3
FROM UTable u
WHERE u.gid = 3 AND u.gt = 'dog night';
我想添加HAVING MIN(u.timestamp),但這無效。
關于我需要做什么的任何指示?
我確實看到了這個問題,但這并不是我所需要的,因為我無法對所有UTable值進行分組,以免選擇太多東西。
uj5u.com熱心網友回復:
GROUP BY u.d(也沒有列出u1, u2, u3)只有u.d在PRIMARY KEY(它不是,并且在您的場景中也沒有意義)時才有效。看:
- 是否有可能以這種方式使用 AGG 函式的 SQL 查詢?
我建議DISTINCT ON在子查詢中UTable改為:
SELECT o.d, u.u1, u.u2, u.u3, o.n
FROM (
SELECT DISTINCT ON (u.d)
u.d, u.u1, u.u2, u.u3
FROM UTable u
WHERE u.gid = 3
AND u.gt = 'dog night'
ORDER BY u.d, u.timestamp
) u
JOIN OTable o USING (gid, gt, d);
看:
- 在每個 GROUP BY 組中選擇第一行?
如果UTable是大的,至少一個多列索引(gid, gt)是可取的。對OTable.
甚至可能在(gid, gt, d). 取決于資料型別,基數,...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/430047.html
標籤:sql PostgreSQL postgresql-9.5
