【问题标题】:Min date with condition using window functions使用窗口函数的最小日期
【发布时间】:2017-11-22 22:17:17
【问题描述】:

我正在尝试使用窗口函数来获取 ColC 变为 True 的第一个日期(按 id 分组)并创建一个新列。

id         date           ColC
1        2017-04-20        t
1        2017-04-19        t
1        2017-04-18        t
2        2017-04-20        t
2        2017-04-19        f

所以我想得到以下结果:

id       first_date           
1        2017-04-18 
2        2017-04-20   

到目前为止,我已经有了一个使用 FIRST_VALUE(date) over(partition by id order by date) 或 min() 的想法。但是,如何合并条件 ColC = t 仍然是一个问题。

是否可以用一行得到结果?

提前谢谢你!

【问题讨论】:

  • 我正在使用 BigQuery

标签: sql google-bigquery window-functions


【解决方案1】:

以下是 BigQuery 标准 SQL 并处理更通用的情况,即 ColC 可以将其状态从 f 更改为 t 并返回 f 然后再次返回 t 多次

#standardSQL
WITH yourTable AS (
  SELECT 1 AS id, DATE '2017-04-20' AS date, 't' AS ColC UNION ALL
  SELECT 1, DATE '2017-04-19', 't' UNION ALL
  SELECT 1, DATE '2017-04-18', 't' UNION ALL
  SELECT 2, DATE '2017-04-21', 't' UNION ALL
  SELECT 2, DATE '2017-04-20', 't' UNION ALL
  SELECT 2, DATE '2017-04-19', 'f' UNION ALL
  SELECT 2, DATE '2017-04-18', 't' UNION ALL
  SELECT 2, DATE '2017-04-17', 'f' 
)
SELECT id, date AS switch_date
FROM (
  SELECT 
    id, date, ColC, 
    LAG(ColC) OVER(PARTITION BY id ORDER BY date) AS prevColC
  FROM yourTable
)
WHERE ColC = 't' AND IFNULL(prevColC, 'f') != 't'
-- ORDER BY id, date DESC 

【讨论】:

    【解决方案2】:

    我很想这样做:

    select min(case when colc = 't' then date end) over (partition by id)
    

    当然,对于您的特定结果,group by 更简单:

    select id, min(date)
    from t
    where colc = 't'
    group by id;
    

    【讨论】:

      【解决方案3】:

      怎么样:

      select id, min(date) as first_date from tablename where ColC='t' group by id
      

      【讨论】:

        猜你喜欢
        • 2022-11-25
        • 2016-01-17
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多