2014-12-30 3 views
1

У меня есть база данных с примерно 50 таблицами (на данный момент), из-за количества данных, которые выливаются в несколько таблиц, мне было поручено создать почасовое резюме данных и сбросить их в другую таблицу. Таким образом, работа с отчетами об исходных данных занимает довольно много времени, так как новая база данных (2 недели) уже составляет до 200 тыс. Записей в одной из двух таблиц, для которых я извлекаю данные.Групповые данные ежечасно и вставляются в итоговую таблицу в Postgres

Запрос получает три возможных результата для клиентов - «cust1», cust2 »и« cust3 », каждая из которых имеет выбранную карту (ответ на вопросник по качеству продукта и потенциальный выигрыш приза), который является одним из 13 вариантов. в письме представление («A» Ace, «K» Король и так далее для соответствующих значений)

Вот один из подзапросов и соответствующий результат:

select sp_cust_card_sequence(cards.cust1) as seq, cards.cust1 as card, count(cards.cust1) as card_count, rtt.game_id as game_id, gt.promo_id as promo_id, gt.choice_id as choice_id, extract(hour from header.start_timestamp) as hour, header.start_timestamp::timestamp::date as date 
    from game_bac_cards cards 
    inner join card_cust_resp header ON (header.id = cards.game_id) 
    inner join game_table gt ON (header.promo_id = gt.promo_id) 
    inner join ref_table_type rtt ON (gt.table_type_id = rtt.id) 
    where result <> 'undef' 
    group by date, hour, card, rtt.game_id, gt.promo_id, gt.choice_id, cards.cust1 

And the result:

По существу, я хотел бы p, например, все значения «K» из столбца карты по часам. С ниже запроса, мне кажется, чтобы быть в состоянии почти добиться этого, но ниже фрагмент кода показывает, что значение «K» за час «» на «12/4/2014» имеет два в отличие от одного. Я уверен, что есть более элегантный способ сделать это.

Окончательный Запрос:

select date, hour, card, seq, sum(card_count) as card_count, game_id, choice_id, promo_id 
from (
select date, hour, card, seq, sum(card_count) as card_count, game_id, choice_id, promo_id from (
    select sp_cust_card_sequence(cards.cust1) as seq, cards.cust1 as card, count(cards.cust1) as card_count, rtt.game_id as game_id, gt.promo_id as promo_id, gt.choice_id as choice_id, extract(hour from header.start_timestamp) as hour, header.start_timestamp::timestamp::date as date 
    from game_bac_cards cards 
    inner join card_cust_resp header ON (header.id = cards.game_id) 
    inner join game_table gt ON (header.promo_id = gt.promo_id) 
    inner join ref_table_type rtt ON (gt.table_type_id = rtt.id) 
    where result <> 'undef' 
    group by date, hour, card, rtt.game_id, gt.promo_id, gt.choice_id, cards.cust1 
) as cust1_table 
where cust1_table.card is not null and cust1_table.card <> '' 
group by date, hour, card_count, card, seq, game_id, choice_id, promo_id 

union all 

select date, hour, card, seq, sum(card_count) as card_count, game_id, choice_id, promo_id from (
    select sp_cust_card_sequence(cards.cust2) as seq, cards.cust2 as card, count(cards.cust2) as card_count, rtt.game_id as game_id, gt.promo_id as promo_id, gt.choice_id as choice_id, extract(hour from header.start_timestamp) as hour, header.start_timestamp::timestamp::date as date 
    from game_bac_cards cards 
    inner join card_cust_resp header ON (header.id = cards.game_id) 
    inner join game_table gt ON (header.promo_id = gt.promo_id) 
    inner join ref_table_type rtt ON (gt.table_type_id = rtt.id) 
    where result <> 'undef' 
    group by date, hour, card, rtt.game_id, gt.promo_id, gt.choice_id, cards.cust2 
) as cust2_table 
where cust2_table.card is not null and cust2_table.card <> '' 
group by date, hour, card_count, card, seq, game_id, choice_id, promo_id 

union all 

select date, hour, card, seq, sum(card_count) as card_count, game_id, choice_id, promo_id from (
    select sp_cust_card_sequence(cards.cust3) as seq, cards.cust3 as card, count(cards.cust3) as card_count, rtt.game_id as game_id, gt.promo_id as promo_id, gt.choice_id as choice_id, extract(hour from header.start_timestamp) as hour, header.start_timestamp::timestamp::date as date 
    from game_bac_cards cards 
    inner join card_cust_resp header ON (header.id = cards.game_id) 
    inner join game_table gt ON (header.promo_id = gt.promo_id) 
    inner join ref_table_type rtt ON (gt.table_type_id = rtt.id) 
    where result <> 'undef' 
    group by date, hour, card, rtt.game_id, gt.promo_id, gt.choice_id, cards.cust3 
) as cust3_table 
where cust3_table.card is not null and cust3_table.card <> '' 
group by date, hour, card_count, card, seq, game_id, choice_id, promo_id 
) as card_details 
and card_details.card is not null and card_details.card <> '' 
group by date, hour, card, card_count, seq, game_id, choice_id, promo_id 
order by date, hour, seq 

Результаты показывает только карту K | час | дата 12/4/2014. Это должно быть только одна строка, а не ДВА. (?)

enter image description here

Любая помощь очень ценится!

ответ

1

Попробуйте удалить группу, на card_count во внешнем запросе

группу по дате, час, card_count, карты, далее, game_id, choice_id, promo_id

+0

Хороший улов Иван, который работал! :) – SiriusBits

Смежные вопросы