Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 sample 1000 записей для каждого месяца  [new]
simple_sample
Guest
Есть таблица в нем поле с датой. Мне нужен запрос который который выдаст некий sample, чтобы было макисимум 1000 записей для каждого месяца. Поискал не нашёл, можно пример или ссылку куда копать?
30 июн 16, 14:13    [19354592]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
Casper_ora
Guest
simple_sample,

rownum<=100 и 
between to_date trunc(('dd.mm.yyyy'........),'DD.MM')

если не ошибаюсь с trunc )
30 июн 16, 14:18    [19354642]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
Egoр
Member

Откуда:
Сообщений: 823
simple_sample,

Типа так?
with r as (select t.*, сount(1) over (partition by trunc(t.date, 'mm') order by rowid) as cnt from t)
select * from t where cnt<1000
30 июн 16, 14:28    [19354722]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
ora601
Member

Откуда:
Сообщений: 750
Egoр
simple_sample,

Типа так?
with r as (select t.*, сount(1) over (partition by trunc(t.date, 'mm') order by rowid) as cnt from t)
select * from t where cnt<1000


Если Sample то order by dbms_random.value тогда.
30 июн 16, 14:44    [19354851]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
Egoр
Member

Откуда:
Сообщений: 823
ora601
Если Sample то order by dbms_random.value тогда.
для "некий sample" и rowid сойдет. в нем буковок меньше :))
30 июн 16, 14:46    [19354871]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
simple_sample
Guest
Egoр
simple_sample,

Типа так?
with r as (select t.*, сount(1) over (partition by trunc(t.date, 'mm') order by rowid) as cnt from t)
select * from t where cnt<1000


неее, так он помоему выдаст все месяцы у которых было меньше тысячи. А надо sample всех месяцов , для каждого месяца максимум 1000 записей

Вот критерий этого запроса:

select trunc(date,'MM'),coun(t)
from (
--здеся запрос который выбирает sample (который мне нужен)
)
group by trunc(date,'MM')
order by 1

01.06.2016 1000
01.05.2016 1000
01.04.2016 878 --нашлось мало
--нету мартовски ваще
01.02.2016 1000
30 июн 16, 14:49    [19354883]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
Egoр
Member

Откуда:
Сообщений: 823
simple_sample,

проверьте действие выражения сount-over-order-by
30 июн 16, 14:51    [19354898]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
Туплю
Guest
Почти так?
with r as (select t.*, 
                  ROW_NUMBER(1) OVER (PARTITION BY trunc(t.date, 'mm') ORDER BY 1) AS RN from t)
select * from t where RN<1000
30 июн 16, 14:55    [19354934]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
simple_sample
Guest
Egoр
simple_sample,

проверьте действие выражения сount-over-order-by


with t as(
SELECT sysdate-level d FROM dual CONNECT BY level < 1000 
),
r as (select t.*, сount(1) OVER (PARTITION BY trunc(t.d, 'mm') ORDER BY rowid) AS cnt from t)
select * from r where cnt<1000


пишет что count инвалид идентифайер. где я что забыл?
30 июн 16, 15:55    [19355567]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
dtdt
Guest
simple_sample,

select trunc(sysdate,'MM')+mod(rownum,20)+rownum/5/24/60 dt from dual connect by level <= 1000
30 июн 16, 15:59    [19355587]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
simple_sample
Egoр
simple_sample,

проверьте действие выражения сount-over-order-by


with t as(
SELECT sysdate-level d FROM dual CONNECT BY level < 1000 
),
r as (select t.*, сount(1) OVER (PARTITION BY trunc(t.d, 'mm') ORDER BY rowid) AS cnt from t)
select * from r where cnt<1000


пишет что count инвалид идентифайер. где я что забыл?

( для начала ) раскладку переключить забыл
select dump('сount ') from dual;
Typ=96 Len=6: 241,111,117,110,116,32
30 июн 16, 16:03    [19355604]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
simple_sample
Guest
orawish, спасибо! с русским языком разобрался. Но тесткейс у меня не взлетает:(



with t as(
SELECT sysdate-level d FROM dual CONNECT BY level < 1000 
),
r as (select t.*, count(1) OVER (PARTITION BY trunc(t.d, 'mm') ORDER BY rowid) AS cnt from t)
select * from r where cnt<1000

ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY, etc.
30 июн 16, 16:08    [19355640]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
Egoр
Member

Откуда:
Сообщений: 823
simple_sample,

тут можно rowid заменить на d
или взять пример от "Туплю"
30 июн 16, 16:13    [19355666]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
simple_sample
Guest
Egoр,
всем спасибо! рабочий вариант:
with t as(
SELECT sysdate-level d FROM dual CONNECT BY level < 1000 
),
r as (select t.*, count(1) OVER (PARTITION BY trunc(t.d, 'mm') ORDER BY d) AS cnt from t)
select * from r where cnt<=10
order by d desc
30 июн 16, 16:17    [19355698]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
-2-
Member

Откуда:
Сообщений: 15330
simple_sample
рабочий вариант:
with t as(
SELECT sysdate-level d FROM dual CONNECT BY level < 1000 
),
r as (select t.*, count(1) OVER (PARTITION BY trunc(t.d, 'mm') ORDER BY d) AS cnt from t)
select * from r where cnt<=10
order by d desc
ввиду альтернативно-одаренного способа нумерации может выдать более 1000 строк.
30 июн 16, 17:35    [19356236]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
Egoр
Member

Откуда:
Сообщений: 823
-2-,

Что я тут не заметил?
30 июн 16, 20:11    [19356874]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
ora601
Member

Откуда:
Сообщений: 750
-2-
simple_sample
рабочий вариант:
with t as(
SELECT sysdate-level d FROM dual CONNECT BY level < 1000 
),
r as (select t.*, count(1) OVER (PARTITION BY trunc(t.d, 'mm') ORDER BY d) AS cnt from t)
select * from r where cnt<=10
order by d desc
ввиду альтернативно-одаренного способа нумерации может выдать более 1000 строк.


Может ничего не выдать если есть одинаковые данные в d.
30 июн 16, 20:31    [19356968]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
simple_sample
Guest
Товарищи, посоветуйте как тогда сделать чтоб выдавало нормально при любых данных?
Ещё раз суть задачи: для таблицы найти sample, чтобы попадали рандомно в него записи с каждого месяца ( для каждого месяца максимум 1000 записей).
1 июл 16, 13:57    [19359467]     Ответить | Цитировать Сообщить модератору
 Re: sample 1000 записей для каждого месяца  [new]
Egoр
Member

Откуда:
Сообщений: 823
simple_sample,

было уже ж 19354851 order by dbms_random.value
1 июл 16, 14:18    [19359645]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить