代码之家  ›  专栏  ›  技术社区  ›  bphi

在PostgreSQL中选择distinct on返回多行

  •  0
  • bphi  · 技术社区  · 8 年前

    当我奔跑

    SELECT DISTINCT ON (ts) * 
    FROM tbl 
    WHERE clause=100 
    AND ts <= '2018-04-02 15:11:18.819000' 
    AND ts > '2018-04-02 15:06:18.819000' 
    ORDER BY ts, version ASC;
    

    我希望有一行对应最大的 ts 符合条件的,用最低的 version .

    查询返回

             ts                     version
    '2018-04-02 15:07:04.828'   ...   1
    '2018-04-02 15:07:05.706'   ...   1
    

    我不明白为什么两个不一样 TS 正在返回。是否存在将返回所需结果的类似查询?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Gordon Linoff    8 年前

    Distinct on ts 会出现一次。哪一个?这是由 order by . 键跟随 distinct on 键决定第一个,所以这是最低的版本号。

    您的查询似乎产生了合理的结果。

    如果希望结果集中有一行 TS 然后使用 按顺序 limit / fetch first 1 row only :

    SELECT * 
    FROM tbl 
    WHERE clause = 100 AND
          ts <= '2018-04-02 15:11:18.819000' AND
          ts > '2018-04-02 15:06:18.819000' 
    ORDER BY ts DESC, version ASC
    FETCH FIRST 1 ROW ONLY;
    

    注意 ts DESC ORDER BY ,以获取 TS .

        2
  •  0
  •   Igor Cova    8 年前

    据我所知,你想得到 version 最后 ts

    在你的情况下,最好用不 DISTINCT 但是 GROUP BY

    例如,此代码可以解决您的问题:

    SELECT max(ts), version 
    FROM tbl 
    WHERE clause=100 
      AND ts <= '2018-04-02 15:11:18.819000' 
      AND ts > '2018-04-02 15:06:18.819000' 
    GROUP BY version;