sql - SQL:如何根据边界条件选择某些值?
问题描述
我正在尝试制定一个 SQL 来根据边界条件从列中选择特定值。(下面的 DDL)。
以下是预期的输出:
说明:
对于具有 Session_id ( A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:46:06.899
) 的第一行,操作类型将为 None,因为它既不是,也不selectSearchHistory
是selectISS
第 2 行和第 3 行。
但是对于第 2 行,我有 action_type selectSearchHistory
,因此我拉入该值,其余保持不变。对于第 3 行,我有 selectISS,因此我提取了该值,其余保持不变
这是我到目前为止所做的:
select session_id,
lag(action_type) over (partition by cust_id, device_event_date order by session_id) as prev_action_type,
tbl_name, marketplace_id, enc_customer_id, device_event_date, page_type, action_type,
ROW_NUMBER () over (partition by session_id order by session_id ) as rn
from test_table where action_type is NOT NULL;
如图所示,我无法将它们分组到每个 action_type 行中。
create table test_table (session_id varchar(200), table_name varchar(100), page_type varchar(100), action_type varchar(100), territory varchar(100), cust_id varchar(100), device_event_date timestamp);
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:46:06.899','page_view','browseFind','','1','A1XYZB0','44270.6986909606');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:46:06.899','page_view','browseSearch','','1','A1XYZB0','44270.6987389699');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:46:06.899','clicks','browseSearch','initiateSearch','1','A1XYZB0','44270.6987484028');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:46:06.899','clicks','browseSearch','executeSearch','1','A1XYZB0','44270.6988179745');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:46:06.899','page_view','browseSearch','','1','A1XYZB0','44270.698827581');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:46:06.899','clicks','searchResults','playSong','1','A1XYZB0','44270.6989970139');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:46:06.899','plbk_attr_search','searchResults','','1','A1XYZB0','44270.6989970139');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:51:21.902','page_view','browseFind','','1','A1XYZB0','44270.7023368287');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:51:21.902','page_view','browseSearch','','1','A1XYZB0','44270.7023457292');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:51:21.902','clicks','browseSearch','selectSearchHistory','1','A1XYZB0','44270.7025611227');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:51:21.902','clicks','browseSearch','executeSearch','1','A1XYZB0','44270.7025611227');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:51:21.902','page_view','browseSearch','','1','A1XYZB0','44270.7025758102');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:51:21.902','clicks','searchResults','selectAlbum','1','A1XYZB0','44270.7026314236');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:51:21.902','plbk_attr_search','searchResults','','1','A1XYZB0','44270.7026314236');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:55:49.632','page_view','browseFind','','1','A1XYZB0','44270.7054355556');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:55:49.632','page_view','browseSearch','','1','A1XYZB0','44270.7054554398');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:55:49.632','clicks','browseSearch','initiateSearch','1','A1XYZB0','44270.7054703241');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:55:49.632','clicks','browseSearch','selectISS','1','A1XYZB0','44270.7055178704');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:55:49.632','clicks','browseSearch','executeSearch','1','A1XYZB0','44270.7055178704');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:55:49.632','page_view','browseSearch','','1','A1XYZB0','44270.7055278241');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:55:49.632','clicks','searchResults','playSong','1','A1XYZB0','44270.7055589236');
INSERT INTO test_table VALUES('A1XYZB0-A2825NDLA7WDZV-2021-03-15 16:55:49.632','plbk_attr_search','searchResults','','1','A1XYZB0','44270.7055589236');
device_event_time 时间戳是纪元。
解决方案
不完全确定您的数据或要求,但这是在您的示例中产生输出的 CTE 方法......
WITH ssh AS
(
SELECT session_id, action_type
FROM test_table
WHERE action_type = 'selectSearchHistory'
), siss AS
(
SELECT session_id, action_type
FROM test_table
WHERE action_type = 'selectISS'
), s AS
(
SELECT session_id, territory, cust_id
FROM test_table
GROUP BY session_id, territory, cust_id
)
SELECT
s.session_id,
COALESCE(ssh.action_type, COALESCE(siss.action_type, 'None')) AS action_type,
s.territory,
s.cust_id
FROM s
LEFT JOIN ssh ON ssh.session_id = s.session_id
LEFT JOIN siss ON siss.session_id = s.session_id;
推荐阅读
- ruby - 没有产出
- r - 如何使用 MARSS 包的动态线性模型进行样本外预测?
- node.js - 使用 OAuth、express 和 React.js 的最佳实践是什么
- node.js - Mongoose / Mongodb - 我应该明确添加 objectid 来填充吗?
- java - 如何在特定的 Swing 选项卡式窗格中添加其他 Swing 组件?
- html - html页面之间的导航在Flask中不起作用
- sql - 色调未捕获空值
- javascript - Firebase 管理员无法读取未定义的属性“证书”
- kotlin - Android SettingsActivity 以编程方式填充 ListPreference
- kubernetes - 如何查看部署的崩溃 pod 日志