【问题标题】:SQL: how do I select two fields of the same SINGLE row in a group?SQL:如何选择组中同一SINGLE行的两个字段?
【发布时间】:2017-10-12 18:15:44
【问题描述】:

我使用的是 Postgres 9.6.*

我有这个:

street | first_name | last_name
1st    | james      | bond
1st    | mr         | q 
1st    | ms         | m
2nd    | man        | with_golden_gun

我想获取不同地址的列表以及每个地址的第一组“first_name”和“last_name”。

我想要的输出:

street | first_name | last_name
1st    | james      | bond
2nd    | man        | with_golden_gun

我按street 分组,并尝试MIN(first_name)MIN(last_name) -- 然而 -- 使用 MIN 时,每组独特的街道都有一些案例,我可以得到看似随机的 混合搭配 first_namelast_name 可能不在同一行。显然,MIN(最小值)在这里不是正确的聚合函数。

我的问题:如何强制 first_namelast_name 来自同一行

【问题讨论】:

  • 你在用什么rdbms
  • 我正在使用 postgres
  • 什么是“第一组'first_name'和'last_name'”?
  • 就我而言,任何两个值的行都相同的集合。我只是不想像“james”+“with_golden_gun”那样混搭作为一组名字和姓氏
  • 我认为@less 是在询问排序的定义——它是按字母顺序排列的吗?

标签: sql postgresql select greatest-n-per-group postgresql-9.6


【解决方案1】:

您可以使用row_number窗口函数来查询每组一行:

SELECT street, first_name, last_name
FROM   (SELECT street, first_name, last_name,
               ROW_NUMBER() OVER (PARTITION BY street ORDER BY first_name) AS rn
        FROM   mytable) t
WHERE  rn = 1

【讨论】:

    【解决方案2】:

    您需要“DISTINCT ON”子句,但这需要排序,例如名字:

    SELECT
     DISTINCT ON (street)
     street, first_name, last_name
    FROM table
    ORDER BY street, first_name
    

    【讨论】:

      【解决方案3】:

      -- 我根据 min first_name 对其进行分组,并根据该名字获取姓氏

      Select street, first_name, 
      (select last_name from person o where o.first_name = x.first_name) 
      from (Select street, min(first_name) as first_name  
      from person v group by street) as x;
      

      -- 输出

      street | first_name | last_name
      -------------------------------------
      1st    | james      | bond
      2nd    | man        | with_golden_gun
      

      -- 如果可以合并名字和姓氏字段

      Select street, min(concat(first_name , ' ' , last_name)) as name
      from person group by street
      

      -- 输出

      street | name 
      ----------------------------
      1st    | james bond
      2nd    | man with_golden_gun
      

      【讨论】:

        【解决方案4】:

        How to show row numbers in PostgreSQL query? 中所述 你可以得到一个行号。 然后您可以根据需要 ORDER 或 WHERE 选择语句。

        【讨论】:

        • 不是我的反对意见,但猜测您在这里的回答最好作为评论。链接到另一个答案并说去看看我的答案通常是不好的形式。答案应该是独立的,提供支持的链接。
        猜你喜欢
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 2020-09-25
        • 2011-01-08
        • 1970-01-01
        • 2020-11-29
        • 2014-11-28
        相关资源
        最近更新 更多