Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Oracle中按行项目的条件计数_Sql_Count_Oracle12c_Analytical - Fatal编程技术网

SQL Oracle中按行项目的条件计数

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

我发布了类似的问题

这次数据集是按行的,但逻辑保持不变。这些项目将添加到列表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 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;