使用 CTE 的动态日期透视
Posted
技术标签:
【中文标题】使用 CTE 的动态日期透视【英文标题】:Dynamic date pivot using CTE 【发布时间】:2020-07-06 10:19:38 【问题描述】:我有一个经过大量计算得到的 CTE,所以最终的 CTE 包含三列 即“名称”、“值”和“日期”。 我搜索了谷歌,在所有 PIVOT 中,日期都是硬编码的,我不希望这些日期被硬编码,因为日期会动态更改。
有什么建议我可以通过 CTE 和动态日期轴获得这个结果吗?
版本 PostgreSQL 11 示例输入
Value. Name Date
"1" "Coenzym Q10" "2020-06-29"
"1" "Coenzym Q10" "2020-06-30"
"4" "Coenzym Q10" "2020-07-01"
"1" "Coenzym Q10" "2020-07-02"
"5" "Coenzym Q10" "2020-07-03"
"1" "Coenzym Q10" "2020-07-04"
"2" "D12" "2020-07-01"
"4" "D12" "2020-07-04"
期望的输出
"Name" "2020-07-04". "2020-07-03" "2020-07-02" "2020-07-01" "2020-06-30". "2020-06-29"
"Coenzym Q10". "4" "5" "1" "1" "1" "1"
"D12" "4" "2"
【问题讨论】:
"我不希望这些日期被硬编码,因为日期会动态更改" - 这是不可能的。 SQL 查询的列数,必须在数据库开始运行该语句之前知道。 @a_horse_with_no_name 那么我们如何通过动态日期获得这种结果,就像每天的日期都会向右移动,我只想显示过去 7 天的详细信息。还有其他方式吗? 【参考方案1】:如果您不坚持将日期作为列名(标题),您可以执行以下操作:
select "Name",
max("Value") filter (where date = current_date) as "Today",
max("Value") filter (where date = current_date - 1) as "Today -1",
max("Value") filter (where date = current_date - 2) as "Today -2",
max("Value") filter (where date = current_date - 3) as "Today -3",
max("Value") filter (where date = current_date - 4) as "Today -4",
max("Value") filter (where date = current_date - 5) as "Today -5",
max("Value") filter (where date = current_date - 6) as "Today -6",
max("Value") filter (where date = current_date - 7) as "Today -7"
from the_table
group by "Name"
order by "Name;
【讨论】:
以上是关于使用 CTE 的动态日期透视的主要内容,如果未能解决你的问题,请参考以下文章