我有一个名为Quarter
的列,其中的数据如下:
Quarter
--------
Q3-2017
Q2-2017
Q1-2017
Q4-2016
Q3-2016
Q2-2016
Q1-2016
Q1-2018
我想从上方找到max()
。我该怎么办?
当我尝试使用MAX()
功能时,它会将输出设为Q4-2017
。
答案 0 :(得分:3)
这种情况正在发生,因为它为您提供了字符串格式的最大列。它按字母顺序排序,这是排序数据时的最大值。如果您想按预期订购它,则需要使用一些字符串操作来降低值以进行排序。
CREATE TABLE #quarters
(
[quarter] NVARCHAR(10)
);
INSERT INTO #quarters ( quarter )
VALUES ( 'Q3-2017' ) ,
( 'Q2-2017' ) ,
( 'Q1-2017' ) ,
( 'Q4-2016' ) ,
( 'Q3-2016' ) ,
( 'Q2-2016' ) ,
( 'Q1-2016' ) ,
( 'Q1-2018' );
SELECT q.quarter Original ,
CAST(RIGHT(q.quarter, 4) AS INT) AS TheYear , -- extracts the year
CAST(SUBSTRING(q.quarter, 2, 1) AS INT) AS TheQuarter -- extracts the quarter
FROM #quarters AS q
ORDER BY CAST(RIGHT(q.quarter, 4) AS INT) DESC ,
CAST(SUBSTRING(q.quarter, 2, 1) AS INT) DESC;
DROP TABLE #quarters;
产地:
Original TheYear TheQuarter
---------- ----------- -----------
Q1-2018 2018 1
Q3-2017 2017 3
Q2-2017 2017 2
Q1-2017 2017 1
Q4-2016 2016 4
Q3-2016 2016 3
Q2-2016 2016 2
Q1-2016 2016 1
上述解决方案也可以在没有强制转换的情况下运行:CAST((XXX) AS INT)
,但如果出现意外值,则更安全。
要获得最高价值,请使用TOP
:
SELECT TOP 1 q.quarter Original
FROM #quarters AS q
ORDER BY CAST(RIGHT(q.quarter, 4) AS INT) DESC ,
CAST(SUBSTRING(q.quarter, 2, 1) AS INT) DESC;
答案 1 :(得分:0)
您可以使用以下查询: 从QuarterTable选择季度,其中右(四分之一,四)=(从QuarterTable中选择最大值(右(四分之一));
答案 2 :(得分:0)
根据您的喜好将quarter
字段拆分为year
(数字!)和quarter
(字符串)和order by
。
获取第一行(top 1
)以仅获取最大值:
SELECT TOP 1 quarter,
CAST(SUBSTRING(quarter, 4, 4) AS INTEGER) AS y,
SUBSTRING(quarter, 1, 2) AS q FROM quarter
ORDER BY y desc, q desc