我在实现根据 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 数据提供两次。
看起来一些条件聚合可以解决问题
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;