PostgreSQL - 在SQL中对特定列进行分组

时间:2017-02-09 18:34:35

标签: sql postgresql group-by aggregate-functions

以前可能会提出类似的问题,但很难找到我正在寻找的答案。

我们说我有这样一张桌子:

     isbn      |       Name 1             | Name 2       | Name 3     |  Date
---------------+--------------------------+--------------+------------+------------
 9998-01-101-9 | Duomenu bazes            | Tadas        | Onaitis    | 1995-12-31
 9998-01-101-9 | Duomenu bazes            | Jonas        | Onaitis    | 1994-02-28
 9998-01-101-9 | Duomenu bazes            | Petras       | Jonaitis   | 1995-05-30
 9998-01-102-7 | Programavimo kalbos      | Petras       | Jonaitis   | 1995-05-30

我想SELECT这个表格,以便每个不同的ISBN和名称1都有最小日期。

使用MIN()聚合函数可以很容易地实现这一点。

通过了解ISBN和名称1的列是等效的,我们可以轻松地GROUP BY这些列和MIN(Date)

但是,我们有列名称2和名称3,它们绑定到日期。

如果我们尝试将它们置于GROUP BY条款下,则会在分组时对其进行检查,但我们并不想要这样做。

我们希望第1-3行是一组,但它们会分开,因为名称2和名称3使这些行不同。

那么如何使这个名称2和名称3不被分组,而是绑定到日期列并作为1列?

不允许使用新的表创建或视图。

尝试的解决方案:内部SELECT从另一个表加入日期,但如果日期重复,这不起作用。

2 个答案:

答案 0 :(得分:2)

您可以使用内置DISTINCT ON获取每个组合isbn和name的最早日期行:

select distinct on (isbn, name_1) *
from your_table
order by isbn, name_1, date;

答案 1 :(得分:0)

在oracle中

    Select isbn, name1, name2, name3,date,min(date)OVER (PARTITION BY isbn, name1)

也许在其他rdbms

中有类似的结构