如何在表分区内进行分区验证

时间:2019-04-02 16:40:35

标签: sql google-bigquery

我有一个如下表 enter image description here

我需要添加一个名为“ FLAG”的新列,如下所示

enter image description here

FLAG列后面的逻辑是

  1. 加入日期<= sys_assignment,然后我需要给FLAG“ Y”作为最小的sys_assignment日期,并保留为“ N”(例如:101和103条记录)

  2. 如果join_date> sys_assignment(如果有任何分区满足此条件,在此示例中为102和104),则仅考虑那些记录(子分区),并为sys_assignment的最大值将FLAG设置为“ Y”,其余全部为“ N”(子分区以厚色突出显示)

请帮助我.. !!!!!

3 个答案:

答案 0 :(得分:1)

以下是用于BigQuery标准SQL

#standardSQL
SELECT empid, join_date, sys_assignment, 
  IF((option AND min_flag) OR (NOT option AND NOT grp AND max_flag), 'Y', 'N') flag
FROM (
  SELECT *, 
    join_date <= sys_assignment grp,  
    COUNT(1) OVER(PARTITION BY empid) = COUNTIF(join_date <= sys_assignment) OVER(PARTITION BY empid) option,
    sys_assignment = MIN(sys_assignment) OVER(PARTITION BY empid, join_date <= sys_assignment) min_flag, 
    sys_assignment = MAX(sys_assignment) OVER(PARTITION BY empid, join_date > sys_assignment) max_flag
  FROM `project.dataset.table`
)   

应用于样本数据时-上面的查询会产生下面的结果(在我看来正是预期的结果)

enter image description here

答案 1 :(得分:0)

您可以使用row_number()

select t.*,
       (row_number() over (partition by empid
                           order by (case when join_date < sys_assignment then 1 else 2 end),
                                    (case when join_date < sys_assignment then sys_assignment end) asc,
                                    (case when join_date < sys_assignment then NULL else sys_assignment end) desc
                          ) = 1
       ) as flag
from t;

此处的标志表示为布尔值而不是字符,这更适合BigQuery。

答案 2 :(得分:0)

可能可以通过分区来做到这一点,但是我发现以这种方式更容易阅读。 查看是否没有记录具有更高的sys_assignment以获取最低记录。然后查看是否还有另一条记录“ No the single case”。

尝试一下:

update mytable
set flag=case when not exists (select 'x' from mytable t where t.join_date=mytable.join_date and t.sys_assignment<mytable.sys_assignment) 
and exists (select 'x' from mytable t where t.join_date=mytable.join_date and t.sys_assignment>mytable.sys_assignment) 
then 'Y' else 'N' end