sql-server 获取每个产品的最新数据

igetnqfo  于 2022-10-31  发布在  其他
关注(0)|答案(3)|浏览(179)

我有一个表,收集证券持有数据的基金,如下图。
如何提取每个基金名称的最新数据?
| 生效日期|基金Name|安全性Name|资产百分比|
| - -|- -|- -|- -|
| 2022年6月30日|基金A| xxx|三十三点三三|
| 2022年6月30日|基金A|年|三十三点三三|
| 2022年6月30日|基金A|兹兹|三十三点三三|
| 2022年7月31日|基金B| xxx|百分之五十|
| 2022年7月31日|基金B|年|百分之五十|
| 2022年8月31日|基金B|年|百分之五十|
| 2022年8月31日|基金B|兹兹|百分之五十|
| 2022年7月31日|基金A| xxx|百分之五十|
| 2022年7月31日|基金A|年|百分之五十|
我期待的是
| 生效日期|基金Name|安全性Name|资产百分比|
| - -|- -|- -|- -|
| 2022年7月31日|基金A| xxx|百分之五十|
| 2022年7月31日|基金A|年|百分之五十|
| 2022年8月31日|基金B|年|百分之五十|
| 2022年8月31日|基金B|兹兹|百分之五十|

0mkxixxg

0mkxixxg1#

这将获得预期的输出

;WITH CTE AS (    
    SELECT EffectiveDate, FundName, SecurityName, PercentageOfAssets
        , ROW_NUMBER() OVER (PARTITION BY FundName ORDER BY EffectiveDate DESC) AS RowNum
)    
SELECT *
FROM CTE
WHERE RowNum = 1
xu3bshqb

xu3bshqb2#

您可以在SQL Server中使用cross apply来执行此操作:

select t1.EffectiveDate, t1.FundName, t1.SecurityName, t1.PercentageOfAssets
from @tbl t1
cross apply (
    select t2.FundName, max(t2.EffectiveDate) maxEffDate
    from @tbl t2
    group by t2.FundName
) latest
where latest.FundName = t1.FundName
    and latest.maxEffDate = t1.EffectiveDate
order by t1.EffectiveDate
8qgya5xd

8qgya5xd3#

创建一个子查询,该子查询将获取MAXEffectiveDate,然后将JOIN传递给外部查询,以返回其余行:

SELECT b.MaxDate, a.FundName, a.SecurityName, a.PercentageOfAssets
FROM (
      SELECT FundName, MAX(EffectiveDate) as MaxDate
      FROM Funds
      GROUP BY FundName
) b
INNER JOIN Funds a
ON a.FundName = b.FundName
  AND a.EffectiveDate = b.MaxDate
ORDER BY a.FundName, a.SecurityName ASC

结果:

| MaxDate    | FundName | SecurityName | PercentageOfAssets |
|------------|----------|--------------|--------------------|
| 31/07/2022 | Fund A   | xxx          | 50%                |
| 31/07/2022 | Fund A   | yyy          | 50%                |
| 31/08/2022 | Fund B   | yyy          | 50%                |
| 31/08/2022 | Fund B   | zzz          | 50%                |

"小提琴“

注意:这将适用于MySQLSQL Server

相关问题