sql - SQL 中的 CASE WHEN 中的数组搜索
问题描述
我目前有两张数据表。根据某些发现,我将根据多个标准加入这两个表。
CASE WHEN a.trans_dt = b.trans_dt and b.trans_type = 'MASSTS' THEN b.trans_details
我的问题是有时trans_Type可能有2个甚至3个,我试过用MAX
MAX(CASE WHEN a.trans_dt = b.trans_dt and b.trans_type = 'MASSTS'
THEN b.trans_details ELSE NULL END) AS trans_Dtls
但这并不总是奏效。
表 b 中有一个字段,它是一个序列号,我想要具有更大序列号的 trans 类型,因为那是当天发生的最后一个。
CASE WHEN a.trans_dt = b.trans_dt and b.trans_type = 'MASSTS'
THEN b.trans_Details(with greatest b.seq_num)
我不知道如何告诉它抓住最大的一个。我不一定说最后,因为数据被摄取的方式最大的 seq_num 可能是第一行或最后一行或两者之间的任何地方,因为它们在被摄取到数据库时没有任何顺序。
解决方案
你可以使用window
函数。
select a.blah.., b.blah...
from a
left join
(select b.* , row_number() over ( partition by trans_type, trans_dt order by trans_type, trans_dt, seq_num desc) as rn from b ) as b
ON b.rn=1 and a.trans_dt = b.trans_dt and b.trans_type = 'MASSTS' --This rn will give you data for maximum row from table b. Pls note to join on correct columns between a and b
说明 - 基于以下两个参数,每个窗口行将被赋予行号,如 1,2,3...
partition by trans_type, trans_dt
- 这将决定您的数据窗口。
order by trans_type, trans_dt, seq_num desc
- 这将在上面的窗口中排序数据。因此,具有最大 seq 的 seq num 将被编号为 1。
推荐阅读
- go - 如何为 helm install 设置注释
- java-native-interface - 我从 c++ dll 回调 java,CallVoidMethod 导致 EXCEPTION_ACCESS_VIOLATION。我错过了什么
- powershell - Powershell 脚本以使用路径填写 Start in section
- vue.js - Vue.js 动画:离开后输入,而不是同时输入
- python - 如何使用 Wand 更改图片的对比度?
- angularjs - 遍历 Angular $$nextSibling 中的对象
- r - 使用 dplyr 添加子组的增量计数
- mongodb - mongodb索引的唯一性
- pine-script - 如何在 pinescript 上的安全功能(多 TF 指标)中使用输入?
- php - 如何使用 Twig 按重量生成随机结果?