# Report sql MST
## Note
- replace '2022-01-01' thành biến số from
- replace '2023-01-01' thành biến số to
## Create MATERIALIZED VIEW
### Created
Step tạo table view
1. CREATE MATERIALIZED VIEW {{table_name}} as
Câu select
2. Đánh index
CREATE UNIQUE INDEX idx_{{table_name}} ON {{table_name}}(giá trị unque 1,giá trị unque 2...);
3. Refresh:
REFRESH MATERIALIZED VIEW CONCURRENTLY {{table_name}};
### Drop
1.Drop
DROP MATERIALIZED VIEW {{table_name}};
2.Created
CREATE MATERIALIZED VIEW {{table_name}} as
Câu select
3. Đánh index
CREATE UNIQUE INDEX idx_{{table_name}} ON {{table_name}}(giá trị unque 1,giá trị unque 2...);
4. Refresh:
REFRESH MATERIALIZED VIEW CONCURRENTLY {{table_name}};
### Cronjob
REFRESH MATERIALIZED VIEW CONCURRENTLY {{table_name}};
### Danh sách table cần tạo
#### offchain_transaction_log_view
- Select
```
select day,owner_address,type_name,sum(mst_amount) as bscs,sum(bscd_amount) as bscd from
(select date(time) as day,time,owner_address,type_name,status,mst_amount,bscd_amount from offchain_transaction_log) as tbl
group by day,type_name,owner_address,status
order by day desc, type_name desc
```
- index: day,type_name,owner_address,status
- Created table view
```
CREATE MATERIALIZED VIEW offchain_transaction_log_view as
select day,owner_address,type_name,status,sum(mst_amount) as bscs,sum(bscd_amount) as bscd from
(select date(time) as day,time,owner_address,type_name,status,mst_amount,bscd_amount from offchain_transaction_log where type_name <> 'SYNC_DAILY') as tbl
group by day,type_name,owner_address,status
order by day desc, type_name desc
;
CREATE UNIQUE INDEX index_offchain_transaction_log_view ON offchain_transaction_log_view(day,type_name,owner_address,status);
REFRESH MATERIALIZED VIEW CONCURRENTLY offchain_transaction_log_view;
```
#### adventure_log_view
- Select
```
select day,character_id,owner_address,sum(mst) as bscs from
(select date(created_at) as day,character_id,owner_address,COALESCE((reward->>'totalRewardMST')::DECIMAL, 0) as mst from adventure_log) as tbl
group by day,character_id,owner_address
order by day desc, character_id desc
```
- index: day,character_id,owner_address
- Created table view
```
CREATE MATERIALIZED VIEW adventure_log_view as
select day,character_id,owner_address,sum(mst) as bscs from
(select date(created_at) as day,character_id,owner_address,COALESCE((reward->>'totalRewardMST')::DECIMAL, 0) as mst from adventure_log) as tbl
group by day,character_id,owner_address
order by day desc, character_id desc
;
CREATE UNIQUE INDEX index_adventure_log_view ON adventure_log_view(day,character_id,owner_address);
REFRESH MATERIALIZED VIEW CONCURRENTLY adventure_log_view;
```
#### salary_bscd_view
- Select
```
select
*,
CASE
WHEN pool_id = 1 THEN block_available * mining_ratio * reward_multiplier /10000
ELSE block_available * mining_ratio * reward_multiplier * advantageAttr_salary /100000
END as salary_bscd,
CASE
WHEN pool_id = 1 THEN total_worked_block_available * mining_ratio * reward_multiplier /10000
ELSE total_worked_block_available * mining_ratio * reward_multiplier * advantageAttr_salary /100000
END as salary_earned
from
(
select
CASE
WHEN c.level = 1 THEN 1
WHEN c.level = 2 THEN 2
WHEN c.level = 3 THEN 4
WHEN c.level = 4 THEN 8
WHEN c.level = 5 THEN 16
WHEN c.level = 6 THEN 25
WHEN c.level = 7 THEN 50
WHEN c.level = 8 THEN 100
WHEN c.level = 9 THEN 150
WHEN c.level = 10 THEN 200
END as reward_multiplier,
CASE
WHEN c.advantage = 'Strength' THEN 10 + (c.strength - 85)*5
WHEN c.advantage = 'Stamina' THEN 10 + (c.stamina - 85)*5
WHEN c.advantage = 'Intelligence' THEN 10 + (c.intelligence - 85)*5
WHEN c.advantage = 'Courage' THEN 10 + (c.courage - 85)*5
WHEN c.advantage = 'Dexterity' THEN 10 + (c.dexterity - 85)*5
WHEN c.advantage = 'Vitality' THEN 10 + (c.vitality - 85)*5
END as advantageAttr_salary,
432000 - remaining_100 + (432000 - remaining_80)*0.8 + (864000 - remaining_5)*0.05 as total_worked_block_available,
tbl5.*
from
(
select tbl4.*,cc.mining_ratio,earning_5*0.05+earning_80*0.8+earning_100 as block_available
from
(
select *,
CASE
WHEN remaining_5 = 0 THEN 0
WHEN working_block_now - earning_100 - earning_80 < remaining_5 THEN working_block_now - earning_100 - earning_80
WHEN working_block_now - earning_100 - earning_80 > remaining_5 THEN remaining_5
END as earning_5
from
(
select *,
CASE
WHEN remaining_80 = 0 THEN 0
WHEN working_block_now - earning_100 < remaining_80 THEN working_block_now - earning_100
WHEN working_block_now - earning_100 > remaining_80 THEN remaining_80
END as earning_80
from
(
select *,
CASE
WHEN remaining_100 = 0 THEN 0
WHEN working_block_now < remaining_100 THEN working_block_now
WHEN working_block_now > remaining_100 THEN remaining_100
END as earning_100
from
(
select c.token_id,c.status,c.total_worked_block,cw.start_working_block,cw.pool_id,sc.value,
sc.value::int - cw.start_working_block as working_block_now,
CASE
WHEN 432000 - c.total_worked_block > 0 THEN 432000 - c.total_worked_block
ELSE 0
END as remaining_100,
CASE
WHEN 432000 - c.total_worked_block > 0 THEN 432000
WHEN 864000 - c.total_worked_block > 0 THEN 864000 - c.total_worked_block
ELSE 0
END as remaining_80,
CASE
WHEN 864000 - c.total_worked_block > 0 THEN 864000
WHEN 1728000 - c.total_worked_block > 0 THEN 1728000 - c.total_worked_block
ELSE 0
END as remaining_5
from CHARACTER as c
inner join
character_work cw
on c.id = cw.character_id
inner join
setting_config sc
on 1=1
where sc.name = 'current_block'
group by c.token_id,c.level,c.total_worked_block,cw.start_working_block,cw.pool_id,sc.value,c.status
) as tbl1
) as tbl2
) as tbl3
) as tbl4
inner join
(
select (data->>'_miningRatio')::INT as mining_ratio from contract_config where name = 'salary_config'
) as cc
on 1=1
) as tbl5
inner join CHARACTER as c
on c.token_id = tbl5.token_id
) as tbl6
```
- index: token_id
- Create table view
```
CREATE MATERIALIZED VIEW salary_bscd_view as
select
*,
CASE
WHEN pool_id = 1 THEN block_available * mining_ratio * reward_multiplier /10000
ELSE block_available * mining_ratio * reward_multiplier * advantageAttr_salary /100000
END as salary_bscd,
CASE
WHEN pool_id = 1 THEN total_worked_block_available * mining_ratio * reward_multiplier /10000
ELSE total_worked_block_available * mining_ratio * reward_multiplier * advantageAttr_salary /100000
END as salary_earned
from
(
select
CASE
WHEN c.level = 1 THEN 1
WHEN c.level = 2 THEN 2
WHEN c.level = 3 THEN 4
WHEN c.level = 4 THEN 8
WHEN c.level = 5 THEN 16
WHEN c.level = 6 THEN 25
WHEN c.level = 7 THEN 50
WHEN c.level = 8 THEN 100
WHEN c.level = 9 THEN 150
WHEN c.level = 10 THEN 200
END as reward_multiplier,
CASE
WHEN c.advantage = 'Strength' THEN 10 + (c.strength - 85)*5
WHEN c.advantage = 'Stamina' THEN 10 + (c.stamina - 85)*5
WHEN c.advantage = 'Intelligence' THEN 10 + (c.intelligence - 85)*5
WHEN c.advantage = 'Courage' THEN 10 + (c.courage - 85)*5
WHEN c.advantage = 'Dexterity' THEN 10 + (c.dexterity - 85)*5
WHEN c.advantage = 'Vitality' THEN 10 + (c.vitality - 85)*5
END as advantageAttr_salary,
432000 - remaining_100 + (432000 - remaining_80)*0.8 + (864000 - remaining_5)*0.05 as total_worked_block_available,
tbl5.*
from
(
select tbl4.*,cc.mining_ratio,earning_5*0.05+earning_80*0.8+earning_100 as block_available
from
(
select *,
CASE
WHEN remaining_5 = 0 THEN 0
WHEN working_block_now - earning_100 - earning_80 < remaining_5 THEN working_block_now - earning_100 - earning_80
WHEN working_block_now - earning_100 - earning_80 > remaining_5 THEN remaining_5
END as earning_5
from
(
select *,
CASE
WHEN remaining_80 = 0 THEN 0
WHEN working_block_now - earning_100 < remaining_80 THEN working_block_now - earning_100
WHEN working_block_now - earning_100 > remaining_80 THEN remaining_80
END as earning_80
from
(
select *,
CASE
WHEN remaining_100 = 0 THEN 0
WHEN working_block_now < remaining_100 THEN working_block_now
WHEN working_block_now > remaining_100 THEN remaining_100
END as earning_100
from
(
select c.token_id,c.status,c.total_worked_block,cw.start_working_block,cw.pool_id,sc.value,
sc.value::int - cw.start_working_block as working_block_now,
CASE
WHEN 432000 - c.total_worked_block > 0 THEN 432000 - c.total_worked_block
ELSE 0
END as remaining_100,
CASE
WHEN 432000 - c.total_worked_block > 0 THEN 432000
WHEN 864000 - c.total_worked_block > 0 THEN 864000 - c.total_worked_block
ELSE 0
END as remaining_80,
CASE
WHEN 864000 - c.total_worked_block > 0 THEN 864000
WHEN 1728000 - c.total_worked_block > 0 THEN 1728000 - c.total_worked_block
ELSE 0
END as remaining_5
from CHARACTER as c
inner join
character_work cw
on c.id = cw.character_id
inner join
setting_config sc
on 1=1
where sc.name = 'current_block'
group by c.token_id,c.level,c.total_worked_block,cw.start_working_block,cw.pool_id,sc.value,c.status
) as tbl1
) as tbl2
) as tbl3
) as tbl4
inner join
(
select (data->>'_miningRatio')::INT as mining_ratio from contract_config where name = 'salary_config'
) as cc
on 1=1
) as tbl5
inner join CHARACTER as c
on c.token_id = tbl5.token_id
) as tbl6
;
CREATE UNIQUE INDEX index_salary_bscd_view ON salary_bscd_view(token_id);
REFRESH MATERIALIZED VIEW CONCURRENTLY salary_bscd_view;
```
## sql
### Wallet Onchain
- Không làm được
### Wallet Offchain - Done
- Fee collected BSCS - BSCD
```
select
(select sum(mst_amount) * 0.1
from offchain_transaction_log
where type_name in ('CHARACTER_MINTED','CHARACTER_UPGRADE') and time BETWEEN '2022-01-01' and '2023-01-01') +
(select sum(mst_amount) * 0.15
from offchain_transaction_log
where type_name in ('WITHDRAW') and time BETWEEN '2022-01-01' and '2023-01-01') as BSCS
,
(select sum(bscd_amount) * 0.1
from offchain_transaction_log
where type_name in ('CHARACTER_MINTED','CHARACTER_UPGRADE') and time BETWEEN '2022-01-01' and '2023-01-01') +
(select sum(bscd_amount) * 0.15
from offchain_transaction_log
where type_name in ('WITHDRAW') and time BETWEEN '2022-01-01' and '2023-01-01')
as BSCD
```
2023/03/24
```
select
(select sum(bscs) * 0.1
from offchain_transaction_log_view
where type_name in ('CHARACTER_MINTED','CHARACTER_UPGRADE') and day BETWEEN '2022-01-01' and '2023-01-01') +
(select sum(bscs) * 0.15
from offchain_transaction_log_view
where type_name in ('WITHDRAW') and status = 'done' and day BETWEEN '2022-01-01' and '2023-01-01') as BSCS
,
(select sum(bscd) * 0.1
from offchain_transaction_log_view
where type_name in ('CHARACTER_MINTED','CHARACTER_UPGRADE') and day BETWEEN '2022-01-01' and '2023-01-01') +
(select sum(bscd) * 0.15
from offchain_transaction_log_view
where type_name in ('WITHDRAW') and status = 'done' and day BETWEEN '2022-01-01' and '2023-01-01')
as BSCD
```
### Deposited/Withdraw
```
select sum(mst_amount) FILTER (where type_name ='DEPOSIT') as Deposit_BSCS, sum(bscd_amount) FILTER (where type_name ='DEPOSIT') as Deposit_BSCD, sum(mst_amount) FILTER (where type_name ='WITHDRAW') as Withdraw_BSCS, sum(bscd_amount) FILTER (where type_name ='WITHDRAW') as Withdraw_BSCD
from offchain_transaction_log
where time BETWEEN '2022-01-01' and '2023-01-01'
```
2023/03/24
```
select sum(mst_amount) FILTER (where type_name ='DEPOSIT') as Deposit_BSCS, sum(bscd_amount) FILTER (where type_name ='DEPOSIT') as Deposit_BSCD, sum(mst_amount) FILTER (where type_name ='WITHDRAW' and status not in ('waiting_approve','rejected')) as Withdraw_BSCS, sum(bscd_amount) FILTER (where type_name ='WITHDRAW' and status not in ('waiting_approve','rejected')) as Withdraw_BSCD
from offchain_transaction_log
where time BETWEEN '2022-01-01' and '2023-01-01'
```
### Gameplay Stat (— Mining Power: ? BSCD/block không làm được) - Done
```
select sum(mst_amount) FILTER (where type_name ='CLAIM_BATTLE_REWARD') as Claim_battle_BSCS, sum(bscd_amount) FILTER (where type_name ='CLAIM_BATTLE_REWARD') as Claim_battle_BSCD,
sum(mst_amount) FILTER (where type_name ='USE_PILL') as UseFill_BSCS, sum(bscd_amount) FILTER (where type_name ='USE_PILL') as UseFill_BSCD,
sum(mst_amount) FILTER (where type_name ='REFILL_ENERGY') as Refill_BSCS, sum(bscd_amount) FILTER (where type_name ='REFILL_ENERGY') as Refill_BSCD
from offchain_transaction_log
where time BETWEEN '2022-01-01' and '2023-01-01'
```
2023/03/23
```
select sum(bscs) FILTER (where type_name ='CLAIM_BATTLE_REWARD') as Claim_battle_BSCS, sum(bscd) FILTER (where type_name ='CLAIM_BATTLE_REWARD') as Claim_battle_BSCD,
sum(bscs) FILTER (where type_name ='USE_PILL') as UseFill_BSCS, sum(bscd) FILTER (where type_name ='USE_PILL') as UseFill_BSCD,
sum(bscs) FILTER (where type_name ='REFILL_ENERGY') as Refill_BSCS, sum(bscd) FILTER (where type_name ='REFILL_ENERGY') as Refill_BSCD
from offchain_transaction_log_view
where day BETWEEN '2022-01-01' and '2023-01-01'
```
### System
- Daily Active Wallets - Done
```
select to_char(time + interval '7 hour','YYYY-MM-DD') as day,count(DISTINCT owner_address) from offchain_transaction_log
where time BETWEEN '2022-01-01' and '2023-01-01'
group by day
order by day desc
```
2023/03/23
```
select day,count(1) from (
select day,owner_address from offchain_transaction_log_view where day BETWEEN '2022-01-01' and '2023-01-01' group by owner_address,day
)j
group by day
order by day desc
```
- Total Wallet Connected - Done
```
select count(DISTINCT wallet_address) from offchain_ledger
```
2023/03/23
```
select count(1) from offchain_ledger
```
- Current working at Mining, chia theo level mỏ - Done
```
select pool_id,count(DISTINCT character_id) from character_work where status = 'working' group by pool_id order by pool_id asc
```
2023/03/23
```
select pool_id,count(1) from character_work where status = 'working' group by pool_id order by pool_id asc
```
- Lượng BSCD mine ra từ các mỏ theo ngày / tuần / tháng - Not Yet
- Total BSCD chưa claim
```
select sum(salary_bscd) from salary_bscd_view where status = 'working'
```
- Total BSCD đã claim theo ngày /tuần tháng
```
select sum(bscd_amount) FILTER (where type_name in ('QUIT_WORKING','CLAIM_SALARY_AND_QUIT_WORK','CLAIM_SALARY') ) as Amount_BSCD
from offchain_transaction_log
where time BETWEEN '2022-01-01' and '2023-01-01'
```
2023/03/23
```
select sum(bscd) FILTER (where type_name in ('QUIT_WORKING','CLAIM_SALARY_AND_QUIT_WORK','CLAIM_SALARY') ) as Amount_BSCD
from offchain_transaction_log_view
where day BETWEEN '2022-01-01' and '2023-01-01'
```
- PVE Heroes theo ngày / tuần / tháng -
```
select to_char(created_at + interval '7 hour','YYYY-MM-DD') as day,count(DISTINCT character_id) from adventure_log
where created_at BETWEEN '2022-01-01' and '2023-01-01'
group by day
order by day desc
```
2023/03/23
```
select day,count(1) from (
select day,character_id from adventure_log_view where day BETWEEN '2022-01-01' and '2023-01-01' group by character_id,day
)j
group by day
order by day desc
```
- Heroes theo level
```
select level,count(*) from "character" group by level order by level asc
```