我正在创建一个报告,该报告需要提取与特定文章的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的一行数据,因为我知道这是该季节中的最大季节,相反,我会得到全部三个
答案 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