【问题标题】:How to determine the order of the result from my postgres query?如何确定我的 postgres 查询的结果顺序?
【发布时间】:2021-07-09 10:49:01
【问题描述】:

我有以下疑问:

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。我怎样才能做到这一点?

【问题讨论】:

  • 查询有GROUP BY 子句但没有聚合函数的情况并不常见。您是否期望要删除的重复项?为此,我们宁愿使用SELECT DISTINCT

标签: sql postgresql sql-order-by


【解决方案1】:

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

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

order by "time", tag

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      试试这个:

      按 1 desc, 2 排序

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多