在一段时间内应用/保持状态



根据这个数据集,John每年都会有一张他所持股票的快照。

我希望数据被标记为,他投资组合中最早购买的股票(仍然存在(被标记为Primary。

例如,给定这个数据集


+------+------+-------+-------+
| Name | Year | Stock | Value |
+------+------+-------+-------+
| John | 2020 | ABC   |   123 |
| John | 2021 | ABC   |   123 |
| John | 2021 | XYZ   |   200 |
| John | 2022 | ABC   |   123 |
| John | 2022 | XYZ   |   200 |
| John | 2022 | JKL   |   500 |
| John | 2023 | XYZ   |   200 |
| John | 2023 | JKL   |   500 |
+------+------+-------+-------+

我希望数据标记为:


+------+------+-------+-------+------------+
| Name | Year | Stock | Value | Is_Primary |
+------+------+-------+-------+------------+
| John | 2020 | ABC   |   123 | Yes        |
| John | 2021 | ABC   |   123 | Yes        |
| John | 2021 | XYZ   |   200 |            |
| John | 2022 | ABC   |   123 | Yes        |
| John | 2022 | XYZ   |   200 |            |
| John | 2022 | JKL   |   500 |            |
| John | 2023 | XYZ   |   200 | Yes        |
| John | 2023 | JKL   |   500 |            |
+------+------+-------+-------+------------+

2020年,John持有ABC,这是唯一一家小学。

2021年,John持有ABC,但也收购了XYZ,但ABC仍然是他的主要股东,因为它是第一家加入的公司。

2022年,约翰持有ABC和XYZ,并加入了JKL,但ABC仍然是他的主要股东。

2023年,约翰不再担任ABC,因此XYZ被标记为主要股东。在同一年添加多个股票的情况下,我希望按字母顺序将最早的股票标记为Primary。

我该如何做到这一点,无论是通过PL/SQL中的函数还是纯SQL中的函数?

这里有一个使用窗口函数的选项:

select name, year, stock, value,
case when 
row_number() 
over(partition by name, year  order by first_year_added, stock)
= 1 then 'yes' 
end is_primary
from (
select
t.*,
min(year) over(partition by name, stock) first_year_added
from mytable t
) t 

子查询计算为每个name添加每个stock的第一年。然后,外部查询使用该信息对具有相同nameyear的记录进行排名:获得第一个排名的记录获得标志。

DB Fiddlde上的演示

名称|年份|股票|价值|IS_PRIMARY:---|----:|----:----|----:|:---------John | 2020 | ABC | 123 |是John | 2021 | ABC | 123 |是约翰|2021 |XYZ |200 |约翰|2022 |ABC |123 |是约翰|2022 |XYZ |200 |约翰|2022 | JKL|500 |约翰|2023|XYZ |200|是约翰|2023|JKL|500|

最新更新