【问题标题】:sql query preference ordersql查询偏好顺序
【发布时间】:2022-01-25 03:54:24
【问题描述】:

我正在为这个查询而苦苦挣扎。我有一个表 deliverystatus 有两个字段,电子邮件和状态。此表填充了电子邮件及其相关的递送状态,例如“正在发送”、“已递送”、“无状态”、“未递送”。对于给定的电子邮件,除了提到的任何其他状态外,它们始终可以是“途中”状态。如果电子邮件的状态为“enroute”且没有其他状态,则应仅选择“enroute”,任何其他状态应始终取代“enroute”并且应该是唯一报告的状态。请查看下表。

|Email       | Status      |
|----------  | ------------|
|abc@abc.com | enroute     |
|abc@abc.com | delivered   |
|xyz@abc.com | delivered   |
|jkl@abc.com | undelivered |
|ppp@abc.com | enroute     |

当我执行此查询时,它应该只会得到以下信息。请注意,abc@abc.com 仅报告了一次“已发送”状态,因为它取代了“enroute”,而 ppp@abc.com 被列为“enroute”,因为没有找到该电子邮件的其他状态。

|Email       | Status      |
|----------  | ------------|
|abc@abc.com | delivered   |
|xyz@abc.com | delivered   |
|jkl@abc.com | undelivered |
|ppp@abc.com | enroute     |

有人可以帮忙吗?

【问题讨论】:

  • 表中应该有时间戳字段,或者至少是某种序列号。
  • 问题真的是您只想以最高优先级状态显示每封电子邮件一次吗?或者表格是否需要通过电子邮件和状态是唯一的,所以只有一行可供选择?或者,正如 wildplasser 所说,它需要一个时间戳,并且只选择每封电子邮件的最新条目?
  • 使用 CASE 表达式,您可以按照您想要的优先顺序为每个预期状态值分配一个值,然后使用 max() 和 GROUP BY 电子邮件来满足您的要求。
  • 是的,像这样的表中有一个时间戳值。 2021-12-17 17:42:18.093

标签: sql select preference


【解决方案1】:

我假设您处理的状态值不超过两个,并且您已经在使用group by

coalesce(max(case when status <> 'enroute' then status end), 'enroute')

或者

coalesce(max(nullif(status, 'enroute')), 'enroute')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多