如何在不使用 Union all with SQL 的情况下添加两个具有最旧和最新日期的新列
How to add two new Columns with the oldest and newest date without using Union all with SQL in BigQuery
我正在尝试在 BigQuery 中创建一个新的 table,其中包括具有最新和最旧日期的两列。
来源Table:
date
concatenatedString
27/08/2019
Housesystems-ActivationHouses-Multiple-Display & Video
03/09/2019
Housesystems-ActivationHouses-Multiple-Display & Video
28/11/2019
Housesystems-ActivationHouses-Multiple-Display & Video
01/09/2019
Housesystems-ActivationHouses-Multiple-Paid Social
11/09/2020
Housesystems-ActivationHouses-Multiple-Paid Social
06/07/2021
Housesystems-ActivationHouses-Multiple-Paid Social
结果:
concatenatedString
Oldest_Date
Newest_Date
Housesystems-ActivationHouses-Multiple-Paid Social
01/09/2019
06/07/2021
Housesystems-ActivationHouses-Multiple-Display & Video
27/08/2019
28/11/2019
这是我的查询:
SELECT
concatenatedString,
MIN(FirstLastDate) AS KampagneStart,
MAX(FirstLastDate) AS KampagneEnd
FROM (
SELECT
MAX(date) AS FirstLastDate,
CONCAT(ifnull(Campaign_Name,
''),'|', ifnull(Campaign_Category,
''),'|',ifnull(Product_Category,
''),'|',ifnull(Powerbrand_Powerline,
''),'|',ifnull(Channel,
'')) AS concatenatedString
FROM
`bigquery-project.ETL_Ready.Union`
GROUP BY
concatenatedString
UNION ALL
SELECT
MIN(date) AS FirstLastDate,
CONCAT(ifnull(Campaign_Name,
''),'|', ifnull(Campaign_Category,
''),'|',ifnull(Product_Category,
''),'|',ifnull(Powerbrand_Powerline,
''),'|',ifnull(Channel,
'')) AS concatenatedString
FROM
`bigquery-project.ETL_Ready.Union`
GROUP BY
concatenatedString )
GROUP BY
concatenatedString
问题是在源代码 table 中,我在单独的列中获取了 concatenatedString 的值,有时我会聚合另一个值。这就是为什么这个查询对我来说不是很灵活。
有谁知道不使用 UNION ALL 就能达到相同结果的有效方法吗?
考虑以下方法
select concatenatedString,
min(date) as Oldest_Date,
max(date) as Newest_Date
from your_table
group by concatenatedString
如果应用于您问题中的示例数据 - 输出为
另一种选择是
select * from your_table
pivot (min(date) as Oldest, max(date) as Newest for 'Date' in ('Date'))
具有相同的输出
P.S。下面是我用于“测试”的 CTE
with your_table as (
select '2019-08-27' date, 'Housesystems-ActivationHouses-Multiple-Display & Video' concatenatedString union all
select '2019-09-03', 'Housesystems-ActivationHouses-Multiple-Display & Video' union all
select '2019-11-28', 'Housesystems-ActivationHouses-Multiple-Display & Video' union all
select '2019-09-01', 'Housesystems-ActivationHouses-Multiple-Paid Social' union all
select '2020-09-11', 'Housesystems-ActivationHouses-Multiple-Paid Social' union all
select '2021-07-06', 'Housesystems-ActivationHouses-Multiple-Paid Social'
)
我正在尝试在 BigQuery 中创建一个新的 table,其中包括具有最新和最旧日期的两列。
来源Table:
date | concatenatedString |
---|---|
27/08/2019 | Housesystems-ActivationHouses-Multiple-Display & Video |
03/09/2019 | Housesystems-ActivationHouses-Multiple-Display & Video |
28/11/2019 | Housesystems-ActivationHouses-Multiple-Display & Video |
01/09/2019 | Housesystems-ActivationHouses-Multiple-Paid Social |
11/09/2020 | Housesystems-ActivationHouses-Multiple-Paid Social |
06/07/2021 | Housesystems-ActivationHouses-Multiple-Paid Social |
结果:
concatenatedString | Oldest_Date | Newest_Date |
---|---|---|
Housesystems-ActivationHouses-Multiple-Paid Social | 01/09/2019 | 06/07/2021 |
Housesystems-ActivationHouses-Multiple-Display & Video | 27/08/2019 | 28/11/2019 |
这是我的查询:
SELECT
concatenatedString,
MIN(FirstLastDate) AS KampagneStart,
MAX(FirstLastDate) AS KampagneEnd
FROM (
SELECT
MAX(date) AS FirstLastDate,
CONCAT(ifnull(Campaign_Name,
''),'|', ifnull(Campaign_Category,
''),'|',ifnull(Product_Category,
''),'|',ifnull(Powerbrand_Powerline,
''),'|',ifnull(Channel,
'')) AS concatenatedString
FROM
`bigquery-project.ETL_Ready.Union`
GROUP BY
concatenatedString
UNION ALL
SELECT
MIN(date) AS FirstLastDate,
CONCAT(ifnull(Campaign_Name,
''),'|', ifnull(Campaign_Category,
''),'|',ifnull(Product_Category,
''),'|',ifnull(Powerbrand_Powerline,
''),'|',ifnull(Channel,
'')) AS concatenatedString
FROM
`bigquery-project.ETL_Ready.Union`
GROUP BY
concatenatedString )
GROUP BY
concatenatedString
问题是在源代码 table 中,我在单独的列中获取了 concatenatedString 的值,有时我会聚合另一个值。这就是为什么这个查询对我来说不是很灵活。
有谁知道不使用 UNION ALL 就能达到相同结果的有效方法吗?
考虑以下方法
select concatenatedString,
min(date) as Oldest_Date,
max(date) as Newest_Date
from your_table
group by concatenatedString
如果应用于您问题中的示例数据 - 输出为
另一种选择是
select * from your_table
pivot (min(date) as Oldest, max(date) as Newest for 'Date' in ('Date'))
具有相同的输出
P.S。下面是我用于“测试”的 CTE
with your_table as (
select '2019-08-27' date, 'Housesystems-ActivationHouses-Multiple-Display & Video' concatenatedString union all
select '2019-09-03', 'Housesystems-ActivationHouses-Multiple-Display & Video' union all
select '2019-11-28', 'Housesystems-ActivationHouses-Multiple-Display & Video' union all
select '2019-09-01', 'Housesystems-ActivationHouses-Multiple-Paid Social' union all
select '2020-09-11', 'Housesystems-ActivationHouses-Multiple-Paid Social' union all
select '2021-07-06', 'Housesystems-ActivationHouses-Multiple-Paid Social'
)