Возвращать результаты только при наличии достаточного количества записей - PullRequest
0 голосов
/ 08 ноября 2018

Заранее спасибо за ваши ответы, это вопрос из двух частей.

База данных будет называться: «Производство» Таблица будет называться "FruitHistory"

Пример данных:

enter image description here

Есть ли способ запросить эти данные так, чтобы он возвращал только результаты, которые содержат данные как минимум за 3 дня (в качестве примера).

Пример: запрос возвращает записи Тони, Дэвида и Аарона, но не записи Берна


Ч.2:

Опирается на правило части 1, но теперь возвращает только данные за 3 дня

Пример: запрос возвращает 11 / 3-11 / 5 для Тони и Аарона и всех данных Дэвида, но все еще не Берна.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Предполагая, что используемая вами СУБД относительно современная, она будет иметь аналитические / оконные функции. В этом случае следующее должно делать то, что вы описываете.

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
0 голосов
/ 08 ноября 2018

В 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
0 голосов
/ 08 ноября 2018

Первая часть:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...