谢谢你的答复,这是一个由两部分组成的问题。
数据库将被称为:“生产”表将被称为:"FruitHistory“
样本数据:
是否有一种方法来查询这些数据,以便它只返回至少有3天数据的结果(举个例子)。
例句:查询返回托尼、大卫和亚伦的记录,但不返回伯尔尼的记录
Part2:
基于第1部分的规则,但现在只返回3天的数据。
例句:查询返回托尼和亚伦的11/3-11/5以及大卫的所有数据,但仍然没有伯尔尼的数据。
谢谢!
发布于 2018-11-08 16:04:11
假设您使用的DBMS是相对现代的,那么它将具有分析/加窗功能。在这种情况下,下面应该做您所描述的事情的类型。
SELECT
*
FROM
(
SELECT
*,
COUNT(*) OVER (PARTITION BY customer_name) AS cust_record_count,
ROW_NUMBER() OVER (PARTITION BY customer_name ORDER BY day_column DESC) AS cust_record_id
FROM
yourTable
)
summarised
WHERE
cust_record_count >= 3
AND cust_record_id <= 3
发布于 2018-11-08 16:29:15
在Oracle12.1或更高版本中,MATCH_RECOGNIZE
可以快速完成此类需求。我在WITH
子句中创建示例数据(不是SQL语句的一部分--使用实际的表名和列名)。我更改了列名--列名中不应该有空格(您的第一列是这样的),而且它们不应该是Oracle关键字(比如日期或日期)。我没有以任何方式对输出进行排序;如果这是最后的报告,而不是用于进一步的处理,则可以在末尾添加order子句。
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
发布于 2018-11-08 15:58:00
第一部分:
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)
https://stackoverflow.com/questions/53211400
复制相似问题