过滤特定列中的特定字符串,否则过滤另一列中的另一个字符串

问题描述 投票:0回答:1

manufacturer_status

组织 年份 目标
ABC 2012 实现了
ABC 2014 部分
ABC 2015 失败
XYZ 2014 部分
XYZ 2015 失败
OPQ 2012 失败

我想要每个组织实现的目标数据。如果它没有实现的目标数据,那么我需要部分目标数据。如果“已实现”和“部分”都不存在,则没有数据。

预期产出

组织 年份 目标
ABC 2012 实现了
XYZ 2014 部分

我尝试过:

Select * from manufacturer_status where target='Achieved'

这只会给出组织 ABC。

Select * from manufacturer_status where target in ('Achieved', 'Partial')

这将为 ABC 提供两次,即“已实现”和“部分”。

sql database database-design hive hbase
1个回答
0
投票

看起来一些条件聚合可以解决问题

SELECT
  ms.Organization,
  ISNULL(
    MIN(CASE WHEN ms.Target = 'Achieved' THEN ms.Year END),
    MIN(CASE WHEN ms.Target = 'Partial'  THEN ms.Year END)
  ) AS Year,
  ISNULL(
    MIN(CASE WHEN ms.Target = 'Achieved' THEN ms.Target END),
    MIN(CASE WHEN ms.Target = 'Partial'  THEN ms.Target END)
  ) AS Target
FROM manufacturer_status ms
WHERE ms.Target IN ('Achieved', 'Partial')
GROUP BY
  ms.Organization;

您还可以使用窗口函数,因为在排序中

Achieved
位于
Partial
之前。

SELECT
  ms.Organization,
  ms.Year,
  ms.Target
FROM (
    SELECT *,
      ROW_NUMBER() OVER (PARTITION BY ms.Organization ORDER BY ms.Target, ms.Year) AS rn
    FROM manufacturer_status ms
    WHERE ms.Target IN ('Achieved', 'Partial')
) ms
WHERE ms.rn = 1;

db<>小提琴

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.