有 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_datecol5 值:

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 语句的子句的主要内容,如果未能解决你的问题,请参考以下文章

where 子句 oracle 中的 case 语句

Oracle:在 Where 子句中使用 Case 语句

具有另一个 sql 语句的 where 子句中的 case 条件

ORDER BY 子句的 CASE WHEN 语句

SQL Server 2008 - SELECT 子句中的 Case / If 语句 [重复]

SQL:WHERE 子句中的 IF/CASE 语句