Это мой стол:Postgres - можно ли группировать подстроку одного из моих полей?
id | integer | not null default nextval('frontend_prescription_id_seq'::regclass)
actual_cost | double precision | not null
chemical_id | character varying(9) | not null
practice_id | character varying(6) | not null
Я хотел бы запросить результаты для конкретного practice_id
, а затем просуммировать actual_cost
по дате и по первых двух символов из chemical_id
. Возможно ли это в Postgres?
Другими словами, я хотел бы вывод, чтобы выглядеть примерно так:
processing_date | cost | chemical_id_substr
01-01-2010 1234 01
01-02-2010 4366 01
01-01-2010 3827 02
01-02-2010 8768 02
Это мой текущий запрос, но он группирует по всей chemical_id
, не подстрока:
query = "SELECT SUM(actual_cost) as cost, processing_date, "
query += "chemical_id as id FROM frontend_items"
query += " WHERE practice_id=%s "
query += "GROUP BY processing_date, chemical_id"
cursor.execute(query, (practice_id,))
Я не уверен, как изменить это на группу подстрокой, или добавить индекс функциональности, или я должен просто денормализовать таблицу и добавить новый столбец. Спасибо за любую помощь.
'GROUP BY processing_date левый (chemical_id, 2)', но вы также необходимо использовать 'left (chemical_id, 2)' в списке выбора. Несвязанный, но: вы сравниваете для равенства в своем запросе: 'WHERE practice_id =% s', поэтому добавление'% '(' practice_id + '%' ') к параметру неверно, если вы не хотите удостовериться, что только значения, которые заканчиваются соответствие '%' –
Это работает: 'GROUP by processing_data, substring (chemical_id from 1 for 2)'. Примечание: в списке выбора вы не можете «химический_ид». – juhist
@a_horse_with_no_name спасибо, что работает красиво. Спасибо также за подсказку, я исправил опечатку. – Richard