如何在表示季节的varchar列上使用聚合函数(MAX)

时间:2019-06-26 02:39:23

标签: sql sql-server

我正在创建一个报告,该报告需要提取与特定文章的MAX季节有关的数据。为此,我需要在SSMS中使用MAX函数。问题在于数据是字母和数字的混合,并且无法识别例如前缀FW实际上在SS之后。在下面提供示例数据。

到目前为止,我一直试图利用变量无济于事

select 
    season, article
from 
    vw_onerange_nam 
where
    article = '656927'
group by 
    season, article 
having 
    season = max(season)

结果是:

season article
------ ------------------
SS2020 656927
SS2019 656927
FW2019 656927 

我希望只获得SS2020的一行数据,因为我知道这是该季节中的最大季节,相反,我会得到全部三个

1 个答案:

答案 0 :(得分:2)

您可以在两个表达式上使用TOP 1和ORDER BY(而不是在单个表达式上使用MAX),如下所示:

SELECT TOP 1 season, article
FROM vw_onerange_nam
WHERE article = '656927'
ORDER BY RIGHT(season,4) DESC, 
         CASE LEFT(season,2) WHEN 'SS' THEN 1 WHEN 'FW' THEN 2 END DESC

我没有将年份部分转换为数字,因为我假设它将始终有4位数字,并且字符串将以相同的方式排序。

如果您除了春季/夏季和秋季/冬季还有其他季节,则可以将它们添加到CASE表达式中,并在THEN子句中添加适当的值。

以后编辑:

如果您需要多篇文章的行,并且每篇文章都有最新的季节,则可以这样使用ROW_NUMBER:

SELECT season, article
FROM (
    SELECT season, article,
        ROW_NUMBER() OVER (PARTITION BY article ORDER BY RIGHT(season,4) DESC, 
             CASE LEFT(season,2) WHEN 'SS' THEN 1 WHEN 'FW' THEN 2 END DESC) AS RowNum
    FROM vw_onerange_nam
) x
WHERE x.RowNum=1