1

这是我的 SQL 视图 - 我们称之为 MyView :

ECode SHCode TotalNrShare CountryCode Country
000001 +00010 100 UKI 英国
000001 ABENSO 900 USA 美国
000355 +00012 1000 ESP 西班牙
000355 000010 50 FRA 法国
000042 009999 10 GER 德国
000042 +00012 999 ESP 西班牙
000787 ABENSO 500 USA 美国
000787 000150 500 ITA 意大利
001010 009999 100 GER 德国

我想为每个 ECode 返回 TotalNrShare 列中数字最大的单行。

例如,我想从上面的视图返回这些结果:

ECode SHCode TotalNrShare CountryCode Country
000001 ABENSO 900 USA 美国
000355 +00012 1000 ESP 西班牙
000042 +00012 999 ESP 西班牙
000787 ABENSO 500 USA 美国
001010 009999 100 GER 德国

(请注意,在 ECode 000787 的情况下,其中有两个 SHCode,每个 500,因为它们的数量相同,我们可以只返回第一行而不是两者,对我来说返回哪一行并不重要,因为这种情况很少发生并且我的分析不需要是 100%)

我尝试了各种方法,但似乎无法返回唯一的结果或我需要的其他国家代码/国家信息。

这是我的尝试之一(基于此站点上的其他解决方案,但我做错了):

SELECT tsh.ECode, tsh.SHCode, tsh.TotalNrShare, tsh.CountryCode, tsh.Country
FROM  dbo.MyView AS tsh INNER JOIN
                   (SELECT DISTINCT ECode, MAX(TotalNrShare) AS MaxTotalSH
                    FROM   dbo.MyView
                    GROUP BY ECode) AS groupedtsh ON tsh.ECode = groupedtsh.ECode AND tsh.TotalNrShare = groupedtsh.MaxTotalSH
4

2 回答 2

2
WITH
  sequenced_data AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY ECode ORDER BY TotalNrShare) AS sequence_id
  FROM
    myView
)
SELECT
  *
FROM
  sequenced_data
WHERE
  sequence_id = 1

但是,这应该给出与您的示例查询相同的结果。这只是完成同一件事的不同方法。

但是,当您说出了点问题时,请您详细说明出了什么问题?TotalNrShare例如实际上是一个字符串吗?这是否会扰乱您的订购(等等MAX()

编辑:

即使上面的代码与您的 SQL Server 不兼容,它也不应该完全崩溃。您应该只收到一条错误消息。例如,尝试执行Select * By Magic,它应该只是给出一个错误。我强烈建议您查看和/或重新安装 Management Studio 的安装。

就替代方案而言,您可以这样做...

SELECT
  *
FROM
  (SELECT ECode FROM MyView GROUP BY ECode) AS base
CROSS APPLY
  (SELECT TOP 1 * FROM MyView WHERE ECode = base.ECode ORDER BY TotalNrShare DESC) AS data

理想情况下,您可以将base子查询替换为已经具有您感兴趣的所有 ECode 的不同列表的表。

于 2012-08-14T11:25:08.203 回答
0

尝试这个;

with cte as( 
 SELECT tsh.ECode, tsh.SHCode, tsh.TotalNrShare, tsh.CountryCode, tsh.Country,
 ROW_NUMBER() over (partition by ECode order by SHCode ) as row_num 
FROM  dbo.MyView)
select * from cte where row_num=1
于 2012-08-14T11:26:22.740 回答