SQL查询编队与SAS

时间:2017-04-14 18:23:21

标签: sql sas

快速背景: 我试图在很长一段时间(大约13年)后重新访问SQL。这一切,我一直在研究SAS。虽然SAS中有一个SQL程序,但我经常使用它,但现在我正在研究开源的东西,我意识到SAS的SQL结构已经高度个性化了。在SAS中编写查询比较简单,但在纯SQL(MariaDB)中编写查询的次数要少得多。由于我对SQL缺乏了解,我可以很好地解释这一点。

问题: 我一直在尝试创建个人财务管理仪表板(同时尝试学习python / MySQL / PHP)。仅在问题的文本中说话,我创建了两个表:

表1 (mutual_fund_all) - 包含有关共同基金ID,当前资产净值的信息的一个。该表为所有共同基金自动附加更新的NAV信息。所以我喜欢10000个共同基金和他们的时间序列导航数据。

表2 (拥有共同基金) - 这个包含我购买的所有资金,我购买它们的价格以及所拥有的单位总数。

现在我想以这样的方式合并这些表,以便我能够看到每个基金的共同基金名称,购买成本和利润。

在SAS中,我会创建几个临时表,然后最终将合并所需的信息以获取所需的信息。在SQL中,我不确定我是否可以做同样的事情,而我的一点点知识在一个查询中强迫我完成所有事情。由于我被困,我需要你的帮助。

这是我写的:

SELECT
    b.owner,
    a.mf_name,
    (b.purchase_price) as purchase_price,
    (b.units*a.mf_nav - b.purchase_price) as profit

FROM    
    mutual_funds            a,
    mf_purchase_summary     b 
where 
    a.mf_id=b.mf_id
group BY    
    b.owner, a.mf_name

这个有点工作,但它没有给我正确的信息,因为它可能从mutual_fund表中拉错了NAV条目。我只需要最新的可用资产净值(表中有一个load_date字段,我只想使用load_date最大的记录中的导航)。我只是无法在SQL中执行此操作。

在SAS中,我在第一步中首先从mutual_funds表中获取了所拥有的共同基金记录。然后在第二步中,我将使用降序load_date对这些过滤后的记录进行排序,只会为每个共同基金提取最高记录,并且在获取导航的情况下,将会进行计算。

我可以在SQL中做类似的事情吗?它只是我的努力(并且还会使整个代码更具可读性/分段性)。

3 个答案:

答案 0 :(得分:0)

SELECT
       b.owner,
       a.mf_name,
       SUM( b.purchase_price ) as purchase_price,
       SUM( b.units*a.mf_nav - b.purchase_price ) as profit    
  FROM    
       mutual_funds            a
INNER JOIN
       mf_purchase_summary     b 
    ON
       a.mf_id=b.mf_id
 GROUP BY    
       b.owner, a.mf_name;

答案 1 :(得分:0)

考虑通过聚合派生表进行连接。在这里,我试着打破你的SAS步骤。整体解决方案应完全符合SAS​​的proc sql和任何其他符合ANSI标准的SQL方言。

单元级联接 (使用显式联接)

在SAS中,我在第一步中首先从mutual_funds表中获取了所拥有的共同基金记录。

SELECT
    b.owner,
    a.mf_name,
    (b.purchase_price) as purchase_price,
    (b.units*a.mf_nav - b.purchase_price) as profit    
FROM    
    mutual_funds            a
INNER JOIN
    mf_purchase_summary     b 
ON a.mf_id=b.mf_id

汇总级

然后在第二步中,我将使用降序load_date对这些过滤后的记录进行排序,只会为每个共同基金提取最高记录,并且在获取导航的情况下,会进行计算。

SELECT        
    a.mf_id,
    a.mf_name,
    MAX(a.load_date) As max_load_date
FROM    
    mutual_funds            a
GROUP BY a.mf_id,
         a.mf_name

整体查询 (在mf_id和load_data上与派生表聚合连接单位级别)

SELECT
    b.owner,
    a.mf_name,
    (b.purchase_price) as purchase_price,
    (b.units*a.mf_nav - b.purchase_price) as profit    
FROM    
    mutual_funds            a
INNER JOIN
    mf_purchase_summary     b 
ON a.mf_id=b.mf_id
INNER JOIN
    (SELECT        
         a.mf_id,
         a.mf_name,
         MAX(a.load_date) As max_load_date
     FROM    
         mutual_funds            a
     GROUP BY a.mf_id,
              a.mf_name) As agg
ON agg.mf_id = a.mf_id 
AND agg.max_load_date = a.load_date

答案 2 :(得分:0)

所以对我有用的最终查询是:

SELECT
    b.owner,
    a.mf_name,
    (b.purchase_price) as purchase_price,
    (b.units*a.mf_nav - b.purchase_price) as profit    
FROM    
    mutual_funds            a
INNER JOIN
    mf_purchase_summary     b 
ON 
    a.mf_id=b.mf_id
INNER JOIN
    (SELECT        
         mf_id,
         mf_name,
         MAX(load_dt) as max_load_date
     FROM    
         mutual_funds            
     GROUP BY mf_id)        c 
ON 
    a.mf_id = c.mf_id 
    AND 
    c.max_load_date = a.load_dt

但是,我会继续改进它。我希望纳入Parfait提出的建议,并在完成后更新答案。