SQL根据条件过滤行

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

我在实现根据 sql 中的条件获取特定行的用例方面面临挑战。我尝试了不同的选项,例如 where 或 LAG 函数。但无法通过。

表 - 制造商状态

组织 年份 目标
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 - 2024. All rights reserved.