【发布时间】:2011-08-01 15:12:31
【问题描述】:
为清楚起见,foobar 表是结构化的,并且具有如下数据:
id、action_dt、status_id 1, '02-JUL-10', 'x' 1, '02-JUL-10', '2' 1, '02-JUL-10', 空 2, '02-JUL-10', 'a' 2, '02-JUL-10', 'b' 3, '02-JUL-10', 'k' 3, '02-JUL-10', 空 3, '03-JUL-10', 'k' 3, '03-JUL-10', 空我需要一个获取 ID 的查询,以便每个 ID 每天都存在一个 NULL 值和一个 NOT NULL 值。因此,在上面的示例数据集中,查询需要返回:
'02-JUL-10', 1 '02-JUL-10', 3 '03-JUL-10', 3是的,可以使用类似的方法来完成:
选择 nulls.action_dt , 空值.id 从(选择 action_dt , ID 来自 foobar 其中 status_id 为空 GROUP BY action_dt) 空值 内连接(选择 action_dt , ID 来自 foobar 其中 status_id 不为空 GROUP BY action_dt) non_nulls ON nulls.action_dt = non_nulls.action_dt AND nulls.id = non_nulls.id但正如您所看到的,除其他外,还有两个子查询和另一个迭代迭代......
我一直在处理并希望得到的查询是以下形式:
选择 action_dt , ID 从 富吧 通过...分组 action_dt , ID , CASE WHEN status_id IS NOT NULL THEN 1 ELSE 0 END 拥有 计数(prim_card_nb)> 1但它并没有完全返回我需要的内容(如您所知,HAVING 子句适用于正在查询的基础数据)。有什么想法吗?
毕竟,似乎一个解决方案是将上述查询放在子查询中并以这种方式过滤它,例如:
选择 action_dt , ID 从(选择 action_dt , ID 从 富吧 通过...分组 action_dt , ID , CASE WHEN status_id IS NOT NULL THEN 1 ELSE 0 END ) repeat_ids_per_day 通过...分组 action_dt , ID 拥有 计数(id)> 1但我觉得它可以更好......
【问题讨论】:
-
虽然标记的答案对于我的具体问题是正确的,但由于实际项目的要求,这似乎是我必须在原始帖子中使用第一个查询,因为从gui,用户必须能够根据条件过滤报告。这个数据集被简化了,它不包含用户可以过滤的标准——所以通过将标准放在 WHERE 子句中似乎可行,但是 where 子句适用于整个数据集,而过滤条件需要应用到数据集的子集...
标签: sql oracle group-by subquery