仅当有足够的记录时才返回结果

时间:2018-11-08 15:52:40

标签: sql oracle

感谢您的答复,这是一个分为两部分的问题。

该数据库将被称为:“生产” 该表将被称为:“ FruitHistory”

样本数据:

enter image description here

是否有一种查询此数据的方法,使其仅返回至少具有3天数据量的结果(例如)。

例如:查询返回托尼,戴维和亚伦的记录,但不返回伯尔尼的记录


第2部分:

以Part1的规则为基础,但现在只返回3天的数据

例如:该查询返回Tony和Aaron以及David的所有数据的11 / 3-11 / 5,但仍未返回Bern的数据。

谢谢!

3 个答案:

答案 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)