【问题标题】:Obtain latest data for each product获取每个产品的最新数据
【发布时间】:2022-10-24 04:15:39
【问题描述】:

我有一张表格,用于收集基金的证券持有数据,如下所示。

如何提取每个 FundName 的最新数据?

EffectiveDate FundName SecurityName PercentageOfAssets
30/06/2022 Fund A xxx 33.33%
30/06/2022 Fund A yyy 33.33%
30/06/2022 Fund A zzz 33.33%
31/07/2022 Fund B xxx 50%
31/07/2022 Fund B yyy 50%
31/08/2022 Fund B yyy 50%
31/08/2022 Fund B zzz 50%
31/07/2022 Fund A xxx 50%
31/07/2022 Fund A yyy 50%

我期待什么

EffectiveDate 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%

【问题讨论】:

  • MySQL <> SQL Server - 请更正您的标签。
  • 如果您认为答案是正确的,您可以接受解决方案吗?

标签: mysql sql sql-server reporting-services


【解决方案1】:

这将得到预期的输出

;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

【讨论】:

    【解决方案2】:

    您可以在 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
    

    【讨论】:

      【解决方案3】:

      创建一个子查询,将获取MAX EffectiveDate 然后将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
      

      结果:

      | 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%                |
      

      小提琴here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-28
        • 2021-12-04
        • 1970-01-01
        • 2021-02-21
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 2017-12-05
        相关资源
        最近更新 更多