admin

SQL根据一列中的最大值从多列中选择不同的行

sql

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

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

我想为每个ECode返回TotalNrShare列中编号最高的单行。

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

ECode SHCode TotalNrShare国家代码国家
000001 ABENSO 900美国美国
000355 +00012 1000 ESP西班牙
000042 +00012 999 ESP西班牙
000787 ABENSO 500美国美国
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

阅读 180

收藏
2021-07-01

共1个答案

admin

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的独特列表。

2021-07-01