如何解决SQL Oracle 中按行进行的项目的条件计数
我发布了类似的问题
conditional count in a list of strings in SQL Oracle
这次数据集是按行进行的,但逻辑保持不变。这些项目将被一一添加到 list1,2,3..。我在将项目添加到列表时使用了日期。
这是数据
CREATE TABLE lists ( column1,column2,column3) AS
SELECT 'list1','01-01-2020','car' FROM DUAL UNION ALL
SELECT 'list1','02-01-2020','car' FROM DUAL UNION ALL
SELECT 'list2','toy' FROM DUAL UNION ALL
SELECT 'list2','03-01-2020','car' FROM DUAL UNION ALL
SELECT 'list3','toy' FROM DUAL UNION ALL
SELECT 'list3','cards' FROM DUAL UNION ALL
SELECT 'list3','cards' FROM DUAL UNION ALL
SELECT 'list4','car' FROM DUAL UNION ALL
SELECT 'list4','cards' FROM DUAL UNION ALL
SELECT 'list5','toy' FROM DUAL UNION ALL
SELECT 'list5','04-01-2020','cards' FROM DUAL UNION ALL
SELECT 'list6','car' FROM DUAL UNION ALL
SELECT 'list6','toy' FROM DUAL UNION ALL
SELECT 'list6','cards' FROM DUAL;
表格看起来像这样
COLUMN1 COLUMN2 COLUMN3
list1 01-01-2020 car
list1 02-01-2020 car
list2 01-01-2020 car
list2 02-01-2020 toy
list2 03-01-2020 car
list3 01-01-2020 toy
list3 02-01-2020 cards
list3 03-01-2020 cards
list4 01-01-2020 car
list4 02-01-2020 cards
list4 03-01-2020 cards
list5 01-01-2020 toy
list5 02-01-2020 cards
list5 03-01-2020 toy
list5 04-01-2020 cards
list6 01-01-2020 car
list6 02-01-2020 cards
list6 03-01-2020 toy
list6 04-01-2020 cards
如果列表中只有 CAR,那么您计算汽车的数量。 如果有非汽车项目,则计算添加到列表中的第一个非汽车项目
例如
list1 car 2
list2 toy 1
list3 toy 1
list4 cards 2
list5 toy 2
list6 cards 2
解决方法
您可以使用窗口函数来获取有关列表的信息,然后可以将其用于过滤:
select l.column1,item_to_count,count(*)
from (select l.*,min(l.column2) keep (dense_rank first order by (case when l.column3 <> 'car' then 1 else 2 end),l.column2) over (partition by l.column1) as date_to_count,min(l.column3) keep (dense_rank first order by (case when l.column3 <> 'car' then 1 else 2 end),l.column2) over (partition by l.column1) as item_to_count
from lists l
) l
where column3 = item_to_count and column2 >= date_to_count
group by l.column1,item_to_count
order by l.column1;
Here 是一个 dbfiddle。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。