SQL Server Max()函数

时间:2018-04-19 08:13:32

标签: sql sql-server

我有一个名为Quarter的列,其中的数据如下:

Quarter
--------
Q3-2017
Q2-2017
Q1-2017
Q4-2016
Q3-2016
Q2-2016
Q1-2016
Q1-2018

我想从上方找到max()。我该怎么办?

当我尝试使用MAX()功能时,它会将输出设为Q4-2017

3 个答案:

答案 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