以前可能会提出类似的问题,但很难找到我正在寻找的答案。
我们说我有这样一张桌子:
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
从另一个表加入日期,但如果日期重复,这不起作用。
答案 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
中有类似的结构