2012-08-14 113 views
1

这是我的SQL视图 - 让叫它MyView的:SQL在一列中选择基于最大值多列不同的行

 
ECode SHCode TotalNrShare CountryCode Country 
000001 +00010 100 UKI United Kingdom 
000001 ABENSO 900 USA United States 
000355 +00012 1000 ESP Spain 
000355 000010 50 FRA France 
000042 009999 10 GER Germany 
000042 +00012 999 ESP Spain 
000787 ABENSO 500 USA United States 
000787 000150 500 ITA Italy 
001010 009999 100 GER Germany 

我想在列最高数字返回单行每个ECode的TotalNrShare。

例如,我想返回从上述鉴于这些结果:

 
ECode SHCode TotalNrShare CountryCode Country 
000001 ABENSO 900 USA United States 
000355 +00012 1000 ESP Spain 
000042 +00012 999 ESP Spain 
000787 ABENSO 500 USA United States 
001010 009999 100 GER Germany 

(注意在ECODE 000787的情况下,存在两个SHCode与每500,因为它们是相同的量我们可以只返回第一排而不是两个,对我来说哪一排是非常重要的,因为这很少会发生,我的分析不需要100%)

我试过各种东西,但似乎不是能够返回unqiue结果或我需要的其他国家代码/国家/地区信息。

这是我的尝试之一(根据本网站上其他解决方案,但我做错了什么):

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 
+2

SQL有哪些风味? MySQL,SQL Server,SQLite,Oracle等都具有不同的功能和不同的语法。另外,你尝试的SQL查询有什么问题?您是否收到错误消息或“错误”结果?如果是这样,请显示这些错误或错误的结果。 – MatBailie 2012-08-14 11:21:58

+0

如果有任何高手能帮助我,我会非常感激! – NSP 2012-08-14 11:22:33

+0

对不起,我的一些文本被切断了,它的SQL Server 2005 – NSP 2012-08-14 11:23:13

回答

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 

理想情况下,你会与已经拥有所有你感兴趣的ECodes的一个独特的名单表更换base子查询in。

+0

谢谢Dems,我试过,但每次我将代码保存到我的视图时崩溃。它是用于SQL 2005吗? (如在SQL Management Studio中崩溃) – NSP 2012-08-14 11:33:38

+0

在回答您关于我的尝试未做的其他查询时,它不返回ECode的单个实例。我得到多行,我只想要每个ECode具有最高TotalNrShares的行。我希望我有道理.. – NSP 2012-08-14 11:35:51

+0

@NSP - 是的,它适用于SQL 2005及更高版本。如果它崩溃,请包含错误消息,我会为你寻找。 *(注意:如果在WITH之前有任何语句,那么它们必须以';'结尾,因此许多人每次都在'WITH'之前放置';',以防万一)* – MatBailie 2012-08-14 11:37:15

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 
+0

谢谢乔G约瑟夫,我也试过你的代码。 SQL管理工作室(2005)再次尝试将我的示例保存在我的视图中时崩溃。林不知道如果我做错了什么或者它不兼容? – NSP 2012-08-14 11:38:33

+0

我试过你的代码谢​​谢,但我没有返回具有TotalNrShares列中最高值的行。我发现检查发现一个ECode有两行,并返回TotalNrShares中最低值的行。 – NSP 2012-08-15 10:08:48

相关问题