Sql 如何在大查询中正确卸载此数组?

Sql 如何在大查询中正确卸载此数组?,sql,google-bigquery,Sql,Google Bigquery,我正在尝试创建一个如下表: | year | week_number | first_week_day | last_week_day | ------------------------------------------------------- | 2019 | 1 | 2019-01-01 | 2019-01-07 | ....................................................... 我已经找到了一些方法,

我正在尝试创建一个如下表:

| year | week_number | first_week_day | last_week_day |
-------------------------------------------------------
| 2019 |     1       |   2019-01-01   | 2019-01-07    |
.......................................................
我已经找到了一些方法,并决定使用EXTRACT和GENERATE_DATE。如果有更好的办法,请告诉我

以下是我到目前为止的情况:

#StandardSQL
WITH

  dates_2018 AS
(SELECT GENERATE_DATE_ARRAY("2018-01-01", "2018-12-31") AS d_2018)

 ,dates_2019 AS
(SELECT GENERATE_DATE_ARRAY("2019-01-01", "2019-12-31") AS d_2019)


SELECT un

FROM dates_2018, UNNEST(d_2018) AS un
--  ,timestamps_2018 AS
-- (SELECT TIMESTAMP(dates_2018) AS timestamps_2018
-- FROM UNNEST(dates_2018))

--  ,d_2018 AS
-- (SELECT EXTRACT(year from timestamps_2018) AS year
--       ,EXTRACT(week from timestamps_2018) AS week
--       ,EXTRACT(day from timestamps_2018) AS day
-- FROM timestamps_2018)

-- SELECT *

-- FROM timestamps_2018
我现在的问题在于,我无法更正数组d_2018的UNNEST,因此我可以将所有元素转换为时间戳,以便稍后从中提取内容

当我取消测试时,它只返回第一行


主要是我在寻找这个令人不安的解决方案,但如果有人能提供更多建议,我会欢迎的。

我不知道你为什么每年都要对数据进行分解。根据您的描述:

WITH dates AS (
      SELECT GENERATE_DATE_ARRAY('2018-01-01', '2019-12-31') as date_array
     )
select extract(year from d) as year, d,
       EXTRACT(week from d) as week,
       date_trunc(d, week) as first_week_day,
       date_add(date_trunc(d, week), interval 6 day) as last_week_day
from dates cross join
     unnest(date_array) d
ORDER BY d;

unest
将数组项转换为表行,以便可以对其运行SQL。 我不知道你想做什么,但你完全可以做类似的事情

选择
D
摘录(从d开始的一周)CW,
摘录(d日起)日,
摘录(从d开始的年份)年份
从UNNEST开始(生成日期数组(“2018-01-01”、“2019-12-31”)作为d

您将来自
generate\u date\u array()

#standardSQL
SELECT DISTINCT
  EXTRACT(YEAR FROM day) AS year,
  EXTRACT(WEEK FROM day) + 1 AS week_number,
  DATE_TRUNC(day, WEEK) AS first_week_day,
  DATE_ADD(DATE_TRUNC(day, week), INTERVAL 6 DAY) AS last_week_day
FROM UNNEST(GENERATE_DATE_ARRAY('2018-01-01', '2019-12-31')) AS day

我这样做是为了先测试2018年,然后测试其余时间。但是你在这里做了一些很好的魔术,我将不得不学习。不管怎样,它工作得很好,所以谢谢你!