如何确定我的 postgres 查询结果的顺序?

How to determine the order of the result from my postgres query?

我有以下查询:

SELECT
    time as "time",
    case 
       when tag = 'KEB1.DB_BP.01.STATUS.SOC' THEN 'SOC'
       when tag = 'KEB1.DB_BP.01.STATUS.SOH' THEN 'SOH'
    end as "tag",
    value as "value"
FROM metrics
WHERE 
    ("time" BETWEEN '2021-07-02T10:39:47.266Z' AND '2021-07-09T10:39:47.266Z') AND
    (container = '1234') AND
    (tag = 'KEB1.DB_BP.01.STATUS.SOC' OR tag = 'KEB1.DB_BP.01.STATUS.SOH')
    GROUP BY 1, 2, 3
    ORDER BY time desc
    LIMIT 2

这是给我的结果:

有时结果的顺序会发生变化,从SOH -> SOC 或从SOC -> SOH。我正在尝试修改我的查询,因此我总是首先获得 SOH,而不是 SOC。我该如何实现?

您有两个相同的 timeorder by 仅使用 time 作为键。当键值相同时,这些键的结果顺序是任意且不确定的。可以从一次执行更改为下一次执行。

为防止出现这种情况,请向 order by 添加一个额外的列,以便每一行都是唯一的。在这种情况下,这似乎是 tag:

order by "time", tag

您想显示最近的两行。在您的示例中,它们具有相同的 date/time 但它们也可能不同。为了找到最近的两行,您必须应用 ORDER BY 子句。

但是,您希望以不同的顺序显示这两行,因此您必须在查询中放置一个额外的 ORDER BY。这是通过从查询结果中选择(即将查询放入子查询)来完成的:

select *
from ( <your query here> ) myquery
order by tag desc;

试试这个:

按 1 desc 排序,2

(第一列降序,第二列降序)