У меня есть база данных с примерно 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
По существу, я хотел бы 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. Это должно быть только одна строка, а не ДВА. (?)
Любая помощь очень ценится!
Хороший улов Иван, который работал! :) – SiriusBits