показ столбцов в определенном шаблоне в postgresql

Эта функция использует словарь вторичных цветов и цветов их компонентов и проверяет, является ли набор цветов компонентов подмножеством набора цветов, переданных ему:

secondary_colours = {"green": ("yellow", "blue"),
                     "purple": ("blue", "red"),
                     "orange": ("red", "yellow"),
                     "grey": ("white", "black"),
                     "beige": ("white", "yellow"),
                     "brown": ("black", "yellow")}

def obtainable_colours(primary_colours):
    """Returns a list of secondary colours obtainable
    from combinations of the primary colours provided.
    Assumes additive pigment mixing as defined above."""
    global secondary_colours
    response = []
    for s_col,components in secondary_colours.items():
        if set(components) < set(primary_colours):
            response.append(s_col)
    return response

Тест:

p1 = ['white','black','yellow'] 
p2 = ['yellow','white','black','red']
p3 = ['blue','yellow','red'] 
p4 = ['white','red','blue']

for p in [p1,p2,p3,p4]:
    print(p)
    print(obtainable_colours(p))
    print("\n")

>>>

['white', 'black', 'yellow']
['grey', 'beige', 'brown']


['yellow', 'white', 'black', 'red']
['orange', 'grey', 'beige', 'brown']


['blue', 'yellow', 'red']
['green', 'purple', 'orange']


['white', 'red', 'blue']
['purple']
0
задан a_horse_with_no_name 19 January 2019 в 19:34
поделиться

1 ответ

Я думаю, вы можете просто добавить зарплату в свой подзапрос «hours_per_month» следующим образом:

select "Staff_Id", 
   extract(year from "Date")::int as work_year,
   extract(month from "Date")::int as work_month,
   sum(hours::interval) work_hours,
   trunc (extract (epoch from sum(hours::interval)) / 3600) * 150 as salary
from hours
where hours is not null
group by "Staff_Id", work_year, work_month

Это предполагает, что вы хотите платить целые часы (15,8 часа = 15 часов оплаты), но если нет, это достаточно легко настроить.

extract (hours может также работать, но не в том случае, если общее количество часов составляет> 24. По моему мнению, не стоит предполагать, что это произойдет, даже в таком случае, когда было бы нереально предполагать, что человек будет работать более 24 часов за один раз. Кроме того, вы можете невольно позже клонировать этот код, чтобы он работал для чего-то вроде «машинных часов», и в этом случае это было бы очень возможно.

Затем, в вашем основном запросе:

select "Staff_Id", 
   work_year,
   sum("work_hours") filter (where work_month = 1) as jan,
   sum(salary) filter (where work_month = 1) as jan_salary,
   sum("work_hours") filter (where work_month = 2) as feb,
   sum(salary) filter (where work_month = 2) as feb_salary,
   ...
   sum("work_hours") filter (where work_month = 12) as dec,
   sum(salary) filter (where work_month = 12) as dec_salary
from hours_per_month  
group by "Staff_Id", work_year

Совершенно не по теме, и я не пытаюсь рассказать вам, как прожить свою жизнь, но когда я вижу кавычки вокруг имен полей и таблиц, unelss это на самом последнем шаге запроса (вывод рендеринга) заставляет мою кожу сканировать. Это также вводит так много шансов на ошибки. По моему мнению, я не одинок:

https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_upper_case_table_or_column_names

0
ответ дан Hambone 19 January 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: