【问题标题】:How to select one email per record [duplicate]如何为每条记录选择一封电子邮件[重复]
【发布时间】:2016-10-29 03:36:11
【问题描述】:

谁能帮我如何为每封电子邮件选择一条记录?

我有以下问题:

SELECT a.ID, a.NAME, a.LASTMODIFIED, b.EMAIL
FROM TABLE_A a
JOIN TABLE_B b
ON a.IDA = b.IDB
WHERE a.LASTMODIFIED <= today
ORDER BY b.LASTMODIFIED

结果是:

+------+-------+--------------------------------------+
| id   | name   | lastmodified      | email           |
+------+-------+--------------------------------------+
| 1    | aa     | 01-JAN-2016       | test01@mail.com |
| 2    | bb     | 02-JAN-2016       | test02@mail.com |
| 3    | cc     | 03-JAN-2016       | test01@mail.com |
| 4    | dd     | 02-JAn-2016       | test03@mail.com |
+------+-------+--------------------------------------+

预期结果是:

+------+-------+--------------------------------------+
| id   | name  | lastmodified       | email           |
+------+-------+--------------------------------------+
| 2    | bb    | 02-JAN-2016        | test02@mail.com |
| 3    | cc    | 03-JAN-2016        | test01@mail.com |
| 4    | dd    | 02-JAN-2016        | test03@mail.com |
+------+-------+--------------------------------------+

它应该每行只返回一封电子邮件,按lastmodified 日期排序。

【问题讨论】:

    标签: sql oracle oracle10g greatest-n-per-group


    【解决方案1】:

    如果你想要最后一封电子邮件,你可以使用

    SELECT a.ID, a.NAME, a.LASTMODIFIED, b.EMAIL
    FROM TABLE_A a
    JOIN TABLE_B b ON a.IDA = b.IDB
    WHERE a.LASTMODIFIED <= today
    AND   (a.LASTMODIFIED,  b.EMAIL) in  (
        SELECT max(c.LASTMODIFIED), d.EMAIL
                FROM TABLE_A c
                JOIN TABLE_B d ON c.IDA = d.IDB
                WHERE a.LASTMODIFIED <= today
                GROUP BY d.EMAIL
        )
    ORDER BY b.LASTMODIFIED
    

    【讨论】:

    • 谢谢,它按预期工作。
    【解决方案2】:

    使用ROW_NUMBER窗口函数

    Select id, name, lastmodified, email     
    (
    Select 
    Row_Number()over(partition by email order by lastmodified desc) As Rn,
    ..
    )
    Where RN = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2013-12-10
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2015-06-29
      相关资源
      最近更新 更多