postgresql - PostgreSQL-10.5 联合拥有单条记录(组合空值)
问题描述
我正在使用 PostgreSQL-10.5。我有两个表格可以从中生成报告。我需要使用ilkokuma
(first reading) 和sonokuma
(last reading) 列进行一些计算。
我可以在一定程度上进行计算。我会再添加一些。我看不出如何join
在单个 SQL 中使用同一张表并尝试使用两个 use union
。下面是我当前的 SQL,我尝试将这两种计算结合起来。
SELECT
faturadata.*,
(SELECT DATE_PART('days', DATE_TRUNC('month', ilkokuma) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL)) as ilkokuma_gun_sayisi,
sabityanma.deger as ilkokuma_deger,
(SELECT DATE_PART('days', DATE_TRUNC('month', ilkokuma) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL)) * sabityanma.deger as ilkokuma_carpim,
null as sonokuma_gun_sayisi,
null as sonokuma_deger,
null as sonokuma_carpim
FROM
faturadata
left join sabityanma on sabityanma.yil = date_part('year', ilkokuma) and sabityanma.ay = date_part('month', ilkokuma)
union
SELECT
faturadata.*,
null as ilkokuma_gun_sayisi,
null as ilkokuma_deger,
null as ilkokuma_carpim,
(SELECT DATE_PART('days', DATE_TRUNC('month', sonokuma) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL)) as sonokuma_gun_sayisi,
sabityanma.deger as sonokuma_deger,
(SELECT DATE_PART('days', DATE_TRUNC('month', sonokuma) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL)) * sabityanma.deger as sonokuma_carpim
FROM
faturadata
left join sabityanma on sabityanma.yil = date_part('year', sonokuma) and sabityanma.ay = date_part('month', sonokuma)
结果是
id tesisat trf kwh tahakkuk ilkokuma sonokuma ilkokuma_gun_sayisi ilkokuma_deger ilkokuma_carpim sonokuma_gun_sayisi sonokuma_deger sonokuma_carpim
2023772 4024546 400 1765 2016-08-31 2016-07-31 2016-08-31 31 9 279
2023772 4024546 400 1765 2016-08-31 2016-07-31 2016-08-31 31 11 341
2023773 4024545 400 3876 2016-08-31 2016-07-31 2016-08-31 31 9 279
2023773 4024545 400 3876 2016-08-31 2016-07-31 2016-08-31 31 11 341
2023774 4024543 400 2126 2016-08-31 2016-07-31 2016-08-31 31 9 279
2023774 4024543 400 2126 2016-08-31 2016-07-31 2016-08-31 31 11 341
可以看出,SQL 正在复制记录。我需要做的是对两个计算都有一个记录。
我想不出我怎么能做到这一点。
解决方案
下次请缩短你的例子:)
我删除了测试表中的一些列
id tahakkuk ilkokuma sonokuma ilko_gun_say ilko_deger sono_gun_say sono_gun_deger
2023772 2016-08-31 2016-07-31 2016-08-31 31 9
2023772 2016-08-31 2016-07-31 2016-08-31 31 11
2023773 2016-08-31 2016-07-31 2016-08-31 31 9
2023773 2016-08-31 2016-07-31 2016-08-31 31 11
你可以做一个简单的组来聚合你的行:
SELECT
id, tahakkuk, ilkokuma, sonokuma,
MAX(ilko_gun_say) as ilko_gun_say,
MAX(ilko_deger) as ilko_deger,
MAX(sono_gun_say) as sono_gun_say,
MAX(sono_gun_deger) as sono_gun_deger
FROM
<YOUR QUERY HERE>
GROUP BY
id, tahakkuk, ilkokuma, sonokuma
我没有考虑对您的查询进行一般优化,因为我对您的语言感到困惑。但是有很多代码重复。我想有很多需要优化的地方——也许是 CTE(https://www.postgresql.org/docs/current/static/queries-with.html)?
推荐阅读
- r - 使用条件和子类别过滤(分层)数据
- elasticsearch - 在 ruby fiter 下使用 Time.parse 时,Logstash 解析失败
- java - Kubernetes 外部连接到 Mongodb 集群
- javascript - 一个函数中有多个事件处理程序
- elixir - JSON 响应的单元测试,匹配 JSON 响应以断言键和值
- r - 在库函数中分配变量
- angular - Angular 6.x 元标记 OG:描述不适用于 FB
- unit-testing - Rails 升级后的神秘 rspec 错误
- javascript - 如何使用 JS 动态创建 SVG 文本元素
- python - 处理的 python 是固定在一个 CPU 上,还是可以使用多个 CPU 超时?