感谢您的答复,这是一个分为两部分的问题。
该数据库将被称为:“生产” 该表将被称为:“ FruitHistory”
样本数据:
是否有一种查询此数据的方法,使其仅返回至少具有3天数据量的结果(例如)。
例如:查询返回托尼,戴维和亚伦的记录,但不返回伯尔尼的记录
第2部分:
以Part1的规则为基础,但现在只返回3天的数据
例如:该查询返回Tony和Aaron以及David的所有数据的11 / 3-11 / 5,但仍未返回Bern的数据。
谢谢!
答案 0 :(得分:3)
假设您使用的DBMS相对较新,它将具有分析/窗口化功能。在这种情况下,应按照您描述的类型进行操作。
4
答案 1 :(得分:1)
在Oracle 12.1或更高版本中,MATCH_RECOGNIZE
可以快速完成这些要求。我在WITH
子句中创建示例数据(不属于SQL语句-使用实际的表名和列名)。我更改了列名-列名中不应包含空格(您的第一列应有空格),并且它们不应是Oracle关键字(如DAY或DATE)。我没有以任何方式订购输出;如果这是最终报告,未在进一步处理中使用,则可以在末尾添加ORDER BY子句。
with
sample_data(customer, dt, fruit) as (
select 'Tony' , date '2018-11-01', 'Orange' from dual union all
select 'Tony' , date '2018-11-02', 'Apple' from dual union all
select 'Tony' , date '2018-11-03', 'Pear' from dual union all
select 'Tony' , date '2018-11-04', 'Plum' from dual union all
select 'Tony' , date '2018-11-05', 'Grape' from dual union all
select 'David', date '2018-11-03', 'Orange' from dual union all
select 'David', date '2018-11-04', 'Watermelon' from dual union all
select 'David', date '2018-11-05', 'Cantelope' from dual union all
select 'Bern' , date '2018-11-05', 'Kiwi' from dual union all
select 'Aaron', date '2018-11-01', 'Orange' from dual union all
select 'Aaron', date '2018-11-02', 'Apple' from dual union all
select 'Aaron', date '2018-11-03', 'Watermelon' from dual union all
select 'Aaron', date '2018-11-04', 'Kiwi' from dual union all
select 'Aaron', date '2018-11-05', 'Pear' from dual
)
select *
from sample_data
match_recognize (
partition by customer
order by dt desc
all rows per match
pattern ( ^ a{3} )
define a as null is null
)
;
输出:
CUSTOMER DT FRUIT
-------- ---------- -------------
Aaron 2018-11-05 Pear
Aaron 2018-11-04 Kiwi
Aaron 2018-11-03 Watermelon
David 2018-11-05 Cantelope
David 2018-11-04 Watermelon
David 2018-11-03 Orange
Tony 2018-11-05 Grape
Tony 2018-11-04 Plum
Tony 2018-11-03 Pear
答案 2 :(得分:-1)
第一部分:
SELECT Name, Count(*)
FROM table
GROUP BY Name
HAVING Count(*)>2
第二部分:
SELECT *
FROM table
WHERE Name IN (SELECT Name
FROM table
GROUP BY Name
HAVING Count(*)>2)