【问题标题】:How do I get the matching id for every record?如何获取每条记录的匹配 ID?
【发布时间】: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


【解决方案1】:

我了解,对于每个帐户和每一天,您都需要timediff 最大的记录。如果是这样,您可以直接在现有子查询上使用distinct on()

select distinct on (account, time::date)
    id,
    time,
    account,
    abs(time - date_trunc('day', time + '12 hours')) as timediff
from platform_statuses
order by account, time::date, timediff desc

【讨论】:

  • 谢谢,这绝对是我需要的。杰出的。另外,你回答得很快,我很感激!
【解决方案2】:

为什么不只是:

select * from platform_statuses
where abs(time - date_trunc('day', time + '12 hours')) =
(
   select max(abs(time - date_trunc('day', time + '12 hours'))) 
   from platform_statuses
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2020-10-01
    • 1970-01-01
    • 2020-12-22
    • 2015-12-04
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多