需要查询以下逻辑以在表中添加新列

时间:2021-04-01 05:35:50

标签: sql sql-server tsql

  • 如果 PersonID 联系人 [TYPE] = "owner" 并在同一天为该 persinID 以相同的 [TYPE] = "owner" 结尾,则输出为 Y
  • 第一个联系人 ID 将是 [TYPE] = "owner" 和 [TITLE] = “身份验证”
  • 如果 personID 以 [TYPE] = "owner" 开头并在同一天以其他类型结束,则输出 N
  • 如果 personID 在特定日期没有 [TYPE] = "owner" 则输出为 NULL

以下是示例数据,预期输出在预期结果列中

请告诉我如何实现它

我试过了,但没有得到预期的结果

<头>
ID 类型 标题 日期 PersonID 预期结果
3656 所有者 身份验证 8/17/2020 5538 N
3688 所有者 状态 8/17/2020 5538 N
4536 打电话 信息 8/17/2020 5538 N
4366 所有者 身份验证 8/17/2020 6838
4379 所有者 状态 8/17/2020 6838
4554 所有者 S 状态 8/17/2020 6838
4494 所有者 身份验证 9/27/2020 3666 N
4503 所有者 状态 9/27/2020 3666 N
4731 回答 打电话 9/27/2020 3666 N
5030 回答 信息 9/27/2020 3666 N
8642 所有者 身份验证 9/27/2020 3666
2635 所有者 身份验证 9/27/2020 5981
2640 所有者 状态 9/27/2020 5981
1234 TEM 私人 10/22/2020 9989
1235 差距 滞后 10/22/2020 9989
1236 损失 损失 10/22/2020 9989
1237 打电话 状态 10/22/2020 9989

1 个答案:

答案 0 :(得分:0)

您可以使用窗口函数,假设排序基于 id -- 特别是 first_value()

您对返回值的描述不完整。但想法是:

select t.*,
       (case when first_type = 'OWNER' and first_type = last_type
             then 'Y'
             when first_type = 'OWNER' and first_title = 'AUTHENTICATION'
             then ?  -- not specified in question
             when first_type = 'OWNER'
             then 'N'
             when sum(case when type = 'OWNER' then 1 else 0 end) over (partition by personid, date) = 0
             then NULL
             else ? -- other cases not specified
       end) as expected_results
from (select t.*,
             first_value(type) over (partition by personid, date order by id) as first_type,
             first_value(title) over (partition by personid, date order by id) as first_title,
             first_value(type) over (partition by personid, date order by id desc) as last_type
      from t
     ) t