【发布时间】:2020-12-25 09:02:20
【问题描述】:
我的表名为platform_statuses,这是它的架构:
CREATE TABLE platform_statuses (
id SERIAL,
account INTEGER REFERENCES users (id),
time TIMESTAMP DEFAULT NOW(),
value_in_cents INTEGER NOT NULL,
status INTEGER NOT NULL CHECK (
0 < status
AND status < 4
) DEFAULT 2,
-- 1: Active, 2: Suspended, 3: Market is closed
open_trades INTEGER NOT NULL,
PRIMARY KEY (id)
);
这是我的查询,我还想获取返回记录的匹配 id。
SELECT
max(timediff),
time :: date,
account
FROM
(
SELECT
id,
time,
account,
abs(time - date_trunc('day', time + '12 hours')) as timediff
FROM
platform_statuses
) AS subquery
GROUP BY
account,
time :: date
另请注意,您在查询中看到的 abs 函数是我从 answer 得到的自定义函数。这是它的定义:
CREATE FUNCTION abs(interval) RETURNS interval AS $ $
SELECT
CASE
WHEN ($ 1 < interval '0') THEN - $ 1
else $ 1
END;
$ $ LANGUAGE sql immutable;
【问题讨论】:
-
没有意义的排序(ORDER BY)子查询
-
我也喜欢你的“状态”字段的 postgresql 枚举。
-
您完全正确地按部分排序,在放弃并发布问题之前对其进行了一段时间的修补后,它被意外遗漏了。至于枚举部分,你是完全正确的,我本来就是这样做的,可惜需要在Access中通过ODBC来访问,而且它没有枚举支持(我认为)。
标签: sql postgresql datetime subquery greatest-n-per-group