根据这个数据集,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
的第一年。然后,外部查询使用该信息对具有相同name
和year
的记录进行排名:获得第一个排名的记录获得标志。
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|空