2012-02-24 4 views
0

У меня есть БД с бревнами TSTAMP USERNAME SUBCR_TYPE и БАЛАНСОМ. Я хочу знать, сколько пользователей были на каждый прошедший конце месяца положительного сальдо по SUBSCR_TYPECOUNT (DISTINCT на конце месяца

результирующей таблицы должно выглядеть следующим образом

  silver|gold|platinum 
2011-09  34|56 |109 
2011-10  23|43 |67 
2011-11  33|56 |45 
. 
. 
. 

Я попытался это с явно ошибочными результатами

SET @ts = unix_timestamp(LAST_DAY('2011-09-01')); 
SELECT COUNT(DISTINCT USERNAME) AS 'silver' 
FROM accLog_table 
WHERE BALANCE>=1 
AND SUBSCR_TYPE = 'silver' 
AND TSTAMP<@ts 

, как я могу сделать это правильно?

+1

Это не отвечает без дополнительной информации о семантике таблицы. Когда создается запись с созданным балансом? Я предполагаю, что вы хотите выбрать самую последнюю запись для каждого пользователя, которая находится до конца месяца (которая может быть в месяц или годы раньше, если в последнее время не было никакой активности), а затем суммировать эти записи по типу подписки. Но это только догадка, вам придется прояснить вопрос. –

+0

Ваша догадка правильная. Запись с балансом была создана по активности. Пользователь действительно может быть последним активным 8 месяцев назад и все еще имеет положительный баланс, поэтому он должен считаться 1 месяцем. Думаю, это точно моя проблема. ДБ только возвращается 8 месяцев, если это облегчает ситуацию. – lunacafu

+0

Я начал делать учет в каждом конце месяца, что облегчает процесс. Мне просто нужны цифры за прошлые пропущенные месяцы. – lunacafu

ответ

0

Я рад опубликовать решение, которое работало для меня

 SET @ts = unix_timestamp(LAST_DAY('2011-09-01'));  
    SET @subcr = 'silver'; 
      INSERT 
      INTO monthlyLiveAccess (
       timePeriod, 
       silver 
      ) 
      SELECT DATE_FORMAT(FROM_UNIXTIME(@ts), "%Y-%m") AS timePeriod, 
       COUNT(*) AS silver FROM (
       SELECT t.* from(
        SELECT DATE_FORMAT(FROM_UNIXTIME(DATE_TIME), "%Y-%m %H:%i:%s") AS "timePeriod", 
        USERNAME, BALANCE 
        from accLog_table 
        WHERE N_BALANCE>1 
        AND DATE_TIME<@ts 
        AND SUBSCR='silver' 
       ORDER BY timePeriod desc) as t 
       GROUP BY USERNAME) AS t1 
      ON DUPLICATE KEY UPDATE silver = VALUES(silver);