如何在不使用 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' 
)