选择模式/众数值SQL

7

我的第一个表 dbo.Port 包含每个投资组合的聚合细节。

Portfolio   Yield   Duration    Coupon
Port1       0.62    1.10        0.98
Port2       0.52    0.91        2.46
Port3       0.40    0.70        0.37

我的第二张表 dbo.Security 包含有关每个投资组合的个别证券的详细信息。

Portfolio   Security    Yield   Duration    Coupon  Country Sector  MarketValue
Port1       Sec1        0.35    0.50        2.25    US      CORP    386.17
Port1       Sec2        0.16    0.23        1.75    UK      CORP    224.64
Port1       Sec3        0.98    1.96        3.00    US      CORP    148.00
Port1       Sec4        0.78    1.40        0.00    DE      SOV     980.07
Port2       Sec1        0.35    0.50        2.25    US      CORP    386.17
Port2       Sec3        0.98    1.96        3.00    US      CORP    148.00
Port3       Sec1        0.35    0.50        2.25    US      CORP    386.17
Port3       Sec4        0.78    1.40        0.00    DE      SOV     980.07
Port3       Sec5        0.03    0.06        0.00    DE      SOV     952.36

我可以通过以下单独的查询检索到投资组合1的模态国家,即US

SELECT x.Country 
FROM (
    SELECT TOP 1 COUNT(dbo.Security.Country) as Count ,dbo.Security.Country
    FROM dbo.Port
    INNER JOIN dbo.Security ON (dbo.Port.Portfolio = dbo.Security.Portfolio)
    WHERE dbo.Port.Portfolio = 'Port1'
    GROUP BY dbo.Security.Country
    ORDER BY Count DESC
    ) x

我希望我的查询结果返回一个连接查询,选择每个组合的国家和行业的模态值。有人知道如何将这个查询整合到第一个查询中或者其他方法,以便我可以检索每个组合的 MODE(dbo.Security.Country) 等内容,并得到下面的表格。请注意保留HTML标记。
Portfolio   Yield   Duration    Coupon  Market Value    Country Sector
Port1       0.62    1.10        0.98    1738.88         US      CORP
Port2       0.52    0.91        2.46    534.17          US      CORP
Port3       0.40    0.70        0.37    2318.60         DE      SOV

期望的SQL

SELECT 
dbo.Port.Portfolio
,dbo.Port.Yield
,dbo.Port.Duration
,dbo.Port.Coupon
,SUM(dbo.Security.MarketValue)

 --Not working
,MODE(dbo.Security.Country)
,MODE(dbo.Security.Sector)  
--Not working

FROM dbo.Port
INNER JOIN dbo.Security ON (dbo.Port.Portfolio = dbo.Security.Portfolio)

GROUP BY
dbo.Port.Portfolio
,dbo.Port.Yield
,dbo.Port.Duration
,dbo.Port.Coupon

3
“Mode”是统计学概念中的一种,指的是出现频率最高的数值。参见维基百科链接:https://en.wikipedia.org/wiki/Mode_(statistics)。 - TylerDurden
1个回答

2

首先,您检索组合1的模型国家的查询应包括一个ORDER BY子句,否则它只会返回与WHERE子句匹配的第一行的国家。

其次,您可以使用内联查询实现所需的输出:

SELECT 
P.Portfolio
,P.Yield
,P.Duration
,P.Coupon
,SUM(S.MarketValue)
,( SELECT TOP 1 Country FROM dbo.Security WHERE Portfolio = P.Portfolio GROUP BY Country ORDER BY COUNT(*) DESC ) Country
,( SELECT TOP 1 Sector FROM dbo.Security WHERE Portfolio = P.Portfolio GROUP BY Sector ORDER BY COUNT(*) DESC ) Sector
FROM dbo.Port P
INNER JOIN dbo.Security S ON (P.Portfolio = S.Portfolio)
GROUP BY
P.Portfolio
,P.Yield
,P.Duration
,P.Coupon

“ORDER BY”在复制和粘贴中丢失了,问题已编辑……该查询为每个投资组合生成“US”和“CORP”的众数。它不返回Port3的“DE”和“SOV”。它似乎是计算组合的众数,而不是各自的投资组合模式。 - TylerDurden
请您尝试一下我修改后的查询。 - weenoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接