我需要添加一个名为“ FLAG”的新列,如下所示
FLAG列后面的逻辑是
加入日期<= sys_assignment,然后我需要给FLAG“ Y”作为最小的sys_assignment日期,并保留为“ N”(例如:101和103条记录)
如果join_date> sys_assignment(如果有任何分区满足此条件,在此示例中为102和104),则仅考虑那些记录(子分区),并为sys_assignment的最大值将FLAG设置为“ Y”,其余全部为“ N”(子分区以厚色突出显示)
请帮助我.. !!!!!
答案 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`
)
应用于样本数据时-上面的查询会产生下面的结果(在我看来正是预期的结果)
答案 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