SQL Oracle中按行项目的条件计数
我发布了类似的问题 这次数据集是按行的,但逻辑保持不变。这些项目将添加到列表1、2、3中。。逐一地。我使用了将项目添加到列表中的日期 这是数据SQL Oracle中按行项目的条件计数,sql,count,oracle12c,analytical,Sql,Count,Oracle12c,Analytical,我发布了类似的问题 这次数据集是按行的,但逻辑保持不变。这些项目将添加到列表1、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
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', '01-01-2020' , 'car' FROM DUAL UNION ALL
SELECT 'list2', '02-01-2020' , 'toy' FROM DUAL UNION ALL
SELECT 'list2', '03-01-2020' , 'car' FROM DUAL UNION ALL
SELECT 'list3', '01-01-2020' , 'toy' FROM DUAL UNION ALL
SELECT 'list3', '02-01-2020' , 'cards' FROM DUAL UNION ALL
SELECT 'list3', '03-01-2020' , 'cards' FROM DUAL UNION ALL
SELECT 'list4', '01-01-2020' , 'car' FROM DUAL UNION ALL
SELECT 'list4', '02-01-2020' , 'cards' FROM DUAL UNION ALL
SELECT 'list4', '03-01-2020' , 'cards' FROM DUAL UNION ALL
SELECT 'list5', '01-01-2020' , 'toy' FROM DUAL UNION ALL
SELECT 'list5', '02-01-2020' , 'cards' FROM DUAL UNION ALL
SELECT 'list5', '03-01-2020' , 'toy' FROM DUAL UNION ALL
SELECT 'list5', '04-01-2020' , 'cards' FROM DUAL UNION ALL
SELECT 'list6', '01-01-2020' , 'car' FROM DUAL UNION ALL
SELECT 'list6', '02-01-2020' , 'cards' FROM DUAL UNION ALL
SELECT 'list6', '03-01-2020' , 'toy' FROM DUAL UNION ALL
SELECT 'list6', '04-01-2020' , '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
如果列表中只有一辆车,那么你要计算汽车的数量。
如果有非汽车项目,则计算添加到列表中的第一个非汽车项目
e、 g
您可以使用窗口函数获取有关列表的信息,这些信息可用于筛选:
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;
是一个dbfiddle。您的输出不相同,应该有3列,但无论如何,计数是错误的,与我想要的输出不同table@Pato . . . 问题很微妙。我修正了答案,加了一把小提琴。
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;