有 case 语句的子句
Posted
技术标签:
【中文标题】有 case 语句的子句【英文标题】:having clause with case statement 【发布时间】:2018-04-03 18:41:41 【问题描述】:我正在尝试获取具有最大日期 col4_date 的行分组,其中 col5 = Hi。我注意到其他人对案例进行了类似的查询。也许我需要使用 in 子句来做到这一点。最大值(col4_date)是失败的地方。任何建议都会很好
select col1, col2, col3 from table1 t1
group by col1, col2, col3
HAVING
sum(case when ( max (col4_date) = col4_date ) and (col5 = 'Hi' ) then 1 else 0 end) > 0
表 1 内容
col1 | col2 | col3 | col4_date | col5 -----+------+------+------------+-- D | F |克| 2018 年 4 月 3 日 |你好 D | F |克| 1970 年 1 月 1 日 |再见 H |我 | Ĵ | 1970 年 1 月 1 日 |你好 H |我 | Ĵ | 2018 年 4 月 3 日 |再见输出
col1 | col2 | col3 -----+------+----- D | F | G感谢您的帮助
【问题讨论】:
样本数据和期望的结果会有所帮助。真的不清楚你想让逻辑做什么。 表 1 内容 col1 col2 col3 col4_date col5 D F G 4/3/2018 Hi D F G 1/1/1970 Bye H I J 1/1/1970 Hi H I J 4/3/2018 Bye output D F G 感谢您的回复。我不知道为什么它不允许回车 不要不将样本数据放入 cmets。 edit你的问题 您使用的是哪种 DBMS 产品?后格雷斯?甲骨文? DB2? 【参考方案1】:使用 Oracle 的 KEEP LAST
获取最后一个 col4_date
的 col5
值:
select col1, col2, col3
from table1
group by col1, col2, col3
having max(col5) keep (dense_rank last order by col4_date) = 'Hi';
【讨论】:
【参考方案2】:这会应用一个 CASE 来获得你的结果:
select col1, col2, col3
from table1 t1
group by col1, col2, col3
HAVING -- compare overall max date and max date for 'Hi'
max(col4_date) = max(case when col5 = 'Hi' then col4_date end)
【讨论】:
【参考方案3】:写为子查询有效
SELECT col1, col2, col3
FROM grp
WHERE (col1, col2, col3, col4) IN ( SELECT col1,
col2,
col3,
MAX (col4)
FROM grp
GROUP BY col1, col2, col3)
AND col5 = 'Hi';
【讨论】:
【参考方案4】:这可能就是你想要的
select col1, col2, col3
from table1 t1
join (select col1, col2, col3, max(col4_date) as max_col4_date
from table1
group by col1, col2, col3
) sub on sub.col1 = t1.col1 and sub.col2 = t1.col2 and sub.col3 = t1.col3 and sub.max_col4_date = t1.col4_date
where col5 = 'Hi'
【讨论】:
那个子查询似乎有点奇怪。 GROUP BY 查询错误?以上是关于有 case 语句的子句的主要内容,如果未能解决你的问题,请参考以下文章
具有另一个 sql 语句的 where 子句中的 case 条件