【问题标题】:Retrieve table data based on specific condition in Teradata根据 Teradata 中的特定条件检索表数据
【发布时间】:2016-10-19 05:36:09
【问题描述】:

我有一个包含以下数据的表格:

emp_id | emp_sal | emp_grp

1          5       HMCCR
1         10       HMCPR
1         20       HMCPR
1         30       HMCPR
1         40       HMCRR
2         40       HMCRR
2         50       HMCCR

我需要在 Teradata 中编写 sql,我需要为每组 emp_id 找到 min(emp_sal)。如果 emp_id 的一行或多行具有 emp_grp='HMCPR',则仅保留这些行并取 emp_sal 的最小值。当没有任何行具有 emp_grp='HMCPR' 并从该组中获取最小的 emp_sal 时,不要执行任何操作。

抱歉,如果您感到困惑。基于上述条件,我的输出应如下所示:

emp_id | emp_sal | emp_grp

1         10       HMCPR
2         40       HMCRR

我尝试了以下查询,但它为每个组提供了 min(emp_sal),因为我使用 group by emp_id, emp_grp

sel
emp_id,
case when emp_grp='HMCPR' then min(emp_sal)
else min(emp_sal) end emp_sal,  emp_grp

from db_wrk.emp_sin 
group by emp_id, emp_grp

谁能帮助我在 teradata 中获得预期的结果。

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    您可以使用 row_number 和一些逻辑来让 emp_grp HMCPR(如果存在)首先被排序。

    select emp_id,emp_sal,emp_grp 
    from (
    select e.*, 
    row_number() over(partition by emp_id 
                      order by case when emp_grp = 'HMCPR' then 0 else 1 end,emp_sal) as rn
    from db_wrk.emp_sin e
    ) t
    where rn = 1
    

    【讨论】:

    • Teradata 有一个 SQL 扩展 QUALIFY,它允许直接过滤 OLAP 函数的结果(类似于 HAVING):select * from db_wrk.emp_sin qualify row_number() over(partition by emp_id order by case when emp_grp = 'HMCPR' then 0 else 1 end,emp_sal) = 1
    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 2018-08-24
    • 1970-01-01
    • 2014-04-16
    • 2014-01-24
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多