Re: Table schema inhancement - Mailing list pgsql-general

From Adrian Klaver
Subject Re: Table schema inhancement
Date
Msg-id d47e1eee-4864-66de-911e-5f0d7f42daa9@aklaver.com
Whole thread Raw
In response to Table schema inhancement  (hmidi slim <hmidi.slim2@gmail.com>)
List pgsql-general
On 04/12/2018 05:59 PM, hmidi slim wrote:
> Hi,
> I have these tables:
> price_per_occupation: id (integer), product_price_period_id(integer), 
> occupation_type(integer), price (numeric)
> 
> product_price_period; id(integer), product_id(integer), 
> is_monday(boolean), is_tuesday(boolean), is_wednesday(boolean), 
> is_thursday(boolean), is_friday(boolean), is_saturday(boolean), 
> is_sunday(boolean), price_period(daterange)
> 
> occupation_type: id(integer), name(varchar)
> 
> product: id(integer), name(varchar)
> 
> I run this query:
> /*select price_per_occupation.price, product_price_period.price_period, 
> occupation_type.name <http://occupation_type.name>
> */
> /*from price_per_occupation inner join product_price_period on 
> product_price_period.id <http://product_price_period.id>= 
> price_per_occupation.product_price_period_id
> */
> /*inner join occupation_type on occupation_type.id 
> <http://occupation_type.id> = price_per_occupation.occupation_type
> */
> /*inner join product on product.id <http://product.id> = 
> product_price_period.product_id
> */
> /*where product_price_period.price_period @> '[2018-07-22, 2018-07-23]'
> */
> /*and occupation_type.id <http://occupation_type.id> = 1*/
> 
> 
> This query returns all the products with an occupation_type = 1 and have 
> the period_price between 2018-07-22 and 2018-07-23.
> 
> However I need to verify if the boolean values verified.
> E.g if is_monday = true the date corresponding to Monday will be 
> eliminated from the period.
> if is_sunday = true and is_friday = true the dates corresponding to 
> Sunday and Friday will be eliminated from the period interval.
> If I will choose all the products in the interval 
> [2018-04-07,2018-04-14] and is_monday = true and is_thursday= true
> the date of monday is 09/04/2018 and date of friday is 13/04/2018.
> I have to get all products contained in [2018-04-07,2018-04-08] U 
> [2018-04-10, 2018-04-12] U [2018-04-14, 2018-04-14]
> 
> In order to get the date of truthy columns I should execute a function 
> which contains a query like that:
> 
> |select *
> |
> |from generate_series(date '2018-04-07', date '2018-04-14', interval '1 
> day') the day
> |
> |where extract ('dow', the_day) = 1
> 
> 
> |
> |I'm face many problems with this schema;
> |
> |I should verify the boolean values.
> |
> |I should extract the corresponding dates based to the values.
> |
> |I decompose the period into different periods then run the query to 
> fetch the products.
> 
> |
> |How can I enhance the query? or is there any proposition for the schema 
> table to enhance it?

My 2 cents eliminate the is_* fields and create a single field:

dow_verified integer[]

Then assuming non-iso week day number Sunday(0) --> Saturday(6) in the 
array enter the day of week(dow) numbers for verified days e.g.:

ARRAY[0, 1, 4]

for Sunday, Monday, Thursday.

Then to get the days that are not verified over a period something like:

WITH dp AS (
     SELECT
         extract('dow' FROM generate_series('04/01/18'::date,
                                            '04/14/18'::date, '1 day'))
             AS dow,
         generate_series('04/01/18'::date, '04/14/18'::date, '1 day')
             AS dt
)
SELECT
     dp.*
FROM
     dp
WHERE
     dp.dow NOT IN (
         (
             SELECT
                 *
             FROM
                 unnest(ARRAY [ 0, 1, 4 ]) AS dow_dt)
         )

ORDER BY
     dt;

dow |           dt
-----+------------------------
    2 | 2018-04-03 00:00:00-07
    3 | 2018-04-04 00:00:00-07
    5 | 2018-04-06 00:00:00-07
    6 | 2018-04-07 00:00:00-07
    2 | 2018-04-10 00:00:00-07
    3 | 2018-04-11 00:00:00-07
    5 | 2018-04-13 00:00:00-07
    6 | 2018-04-14 00:00:00-07
(8 rows)



> |
> ||
> ||
> 
> 
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com


pgsql-general by date:

Previous
From: Nick Cleaton
Date:
Subject: Re: how to securely delete the storage freed when a table is dropped?
Next
From: David Steele
Date:
Subject: Re: Barman versus pgBackRest