Mysql Запрос - За какое время собирается нужное кол-во

sublimity

Новичок
Подскажите какой нужно сделать запрос,
чтобы решить задачу :

Дано : таблица сколько покупок (tcount) сделал пользователь (user_id) в минуту

row_id -
user_id - int
dt - datetime - время
tcount - int - кол-во ( 1 ... ) допустим товаров
PHP:
0  | 3347  |   2012-11-10 01:00 | 9
1  | 3347  |   2012-11-10 01:00 | 2
2  | 1233  |   2012-12-20 20:00 | 3
3  | 1233  |   2012-12-21 21:05 | 2
4  | 1233  |   2012-12-22 21:11 | 3
5  | 3347  |   2013-01-20 01:00 | 5
6  | 3347  |   2013-01-20 01:01 | 9
7  | 1233  |   2013-01-20 01:11 | 6

NOW()='2013-01-20 01:20'
Нужно определить , минимальное время от текущего момента за которое пользователь купил более 10 товаров.


Результат для примера :
user_id = 1233 ; result_time = 2012-12-21 21:05 ( строки : 7,4,2 но НЕ 1 )
user_id = 3347 ; result_time = 2013-01-20 01:00 ( строки : 6,5 )

Голову сломал - а сделать это только средствами mysql - не могу.

Заранее спасибо!
 

~WR~

Новичок
В настоящей СУБД это выглядело бы как-то так:
PHP:
SELECT user_id, max(dt) as date
FROM (
    SELECT user_id, dt, sum(tcount) OVER (PARTITION BY user_id ORDER BY dt DESC) AS tcount_sum
    FROM table
) a
WHERE tcount_sum > 10
GROUP BY user_id
Для каждого пользователя выведет самую последнюю дату, на которую было накоплено больше 10 товаров, если считать в обратном порядке от текущего момента.

Но с mysql, видимо, остается только тихо поплакать в уголке.
 

Ragazzo

TDD interested
~WR~
<sarcasm>
ну да конечно, взял так перекинул агрегирующую функцию через OVER() и круто)) "дерись" как мужчина, без фишек БД :D
<sarcasm>
 

Gas

может по одной?
в mysql тоже можно нечто изобразить, правда 2-мя запросами и с большими плясками:

PHP:
SET @prev=0,@sum=0;

SELECT user_id, max(dt) AS dt
FROM (
  SELECT user_id, dt, IF(@prev!=user_id, GREATEST(@sum:=0, @prev:=user_id), 0), @sum:=@sum+tcount AS summ
  FROM `_table_` AS t
  WHERE dt <= NOW()
  ORDER BY user_id, dt DESC
) AS t
WHERE summ>=10
GROUP BY user_id
Но такие запросы только для статистики в админ-панели.
Вызывать на каждый чих - серверу может стать совсем не хорошо, если данных хотя бы несколько сот тыщ
 

sublimity

Новичок
~WR~

Спасибо за идею , как можно погуглить : "mysql select OVER PARTITION"

Вариант первый который получился :

PHP:
SELECT 
MAX(dt) as TimeFrom,cust_id
FROM 
(
SELECT 
t.dt,
t.`cust_id`,
SUM(t2.counter) as sums
FROM `aggr_news` as t
JOIN `aggr_news` as t2 ON (t.`cust_id`=t2.`cust_id` AND t.dt<=t2.`dt`)
GROUP BY t.`cust_id`,t.dt
HAVING sums >= 10
ORDER BY t.`cust_id`,t.dt DESC
) as z
GROUP BY cust_id
ORDER BY cust_id
 

sublimity

Новичок
Gas

Спасибо за ваш вариант, но к сожалению он не подошел к моей DB - я использую InfiniDB

А там error: IDB-3021: Subquery cannot be used within an expression.
или IDB-1001: Function 'set_user_var' can only be used in the outermost select or order by clause and cannot be used in conjunction with an aggregate function.
 
Сверху