Re: SELECT is faster on SQL Server
От | Frank Millman |
---|---|
Тема | Re: SELECT is faster on SQL Server |
Дата | |
Msg-id | a611d434-7dbf-384d-e8f4-c2b8d5c21440@chagford.com обсуждение исходный текст |
Ответ на | Re: SELECT is faster on SQL Server (Thomas Kellerer <shammat@gmx.net>) |
Список | pgsql-general |
On 2021-03-19 7:11 PM, Thomas Kellerer wrote: > Frank Millman schrieb am 19.03.2021 um 10:16: >> >> cl_bal selects WHERE tran_date <= '2018-03-31'. >> >> op_bal selects WHERE tran_date < '2018-03-01'. >> >> The second one could be written as WHERE tran_date <= '2018-02-28', >> but I don't think that would make any difference. > > I knew I overlooked something ;) > > But as one is a true subset of the other, I think you can merge that > into a single SELECT statement: > > select '2018-03-01' AS op_date, > '2018-03-31' AS cl_date, > a.source_code_id, > sum(a.tran_tot) AS cl_tot, > sum(a.tran_tot) filter (where tran_date < '2018-03-01') AS > op_tot > FROM ( > SELECT distinct on (location_row_id, function_row_id, > source_code_id) source_code_id, tran_tot, tran_date > FROM prop.ar_totals > WHERE deleted_id = 0 > AND tran_date <= '2018-03-31' > AND ledger_row_id = 1 > ORDER BY location_row_id, function_row_id, source_code_id, > tran_date DESC > ) AS a > GROUP BY a.source_code_id > Thanks very much Thomas - I did not know about FILTER. But it does not quite work. If the SELECT does find a row where the max tran_date is <= '2018-03-31' it correctly includes it in 'cl_tot'. But the filter returns nothing for 'op_tot' because there is no corresponding row where tran_date < '2018-03-01'. But I have learned something new, so thanks for that. Frank
В списке pgsql-general по дате отправления: