2015-12-02 2 views
-1

У меня есть таблица с годом, месяцем, днем, следующим образом.Как получить максимальную колонку с помощью sql?

Year  Month Day 
2015  10 28 
2015  10 29 
2015  10 29 
2015  10 30 
2015  10 30 
2015  10 30 
2015  11 4 
2015  11 5 
2015  11 9 
2015  11 19 
2016  1  31 
2016  4  1 

Я хочу, чтобы получить самый высокий год и соответствующий высокий месяц в этом году и на следующий день этого года, месяц колонны

Выход:

2016 4 1

Если таблица Безразлично не содержат 2016 1 31 2016 4 1

Строки вывода будут 2015 11 19

+0

Вы хотите иметь последнюю дату в году? –

+0

Зачем заказывать по убыванию? –

ответ

1
DECLARE @temp TABLE 
(
    Y SMALLINT, 
    M TINYINT, 
    D TINYINT, 
    PRIMARY KEY CLUSTERED (Y DESC, M DESC, D DESC) WITH(IGNORE_DUP_KEY=ON) 
) 

INSERT INTO @temp (Y, M, D) 
VALUES 
    (2015, 10, 28), (2015, 10, 29), 
    (2015, 10, 29), (2015, 10, 30), 
    (2015, 10, 30), (2015, 10, 30), 
    (2015, 11, 4), (2015, 11, 5), 
    (2015, 11, 9), (2015, 11, 19), 
    (2016, 1 , 31), (2016, 4 , 1) 

SELECT TOP(1) * 
FROM @temp 
ORDER BY Y DESC, M DESC, D DESC 

результаты -

Y  M D 
------ ---- ---- 
2016 4 1 
0

Вы можете использовать максимальную функцию в SQL.

SELECT max(Year) as Year, Month, Day FROM table_name. 

Надеюсь, что эта помощь!

0

Проверьте этот пример.

DECLARE @temp TABLE 
(
    Y SMALLINT, 
    M TINYINT, 
    D TINYINT, 
    PRIMARY KEY CLUSTERED (Y DESC, M DESC, D DESC) WITH(IGNORE_DUP_KEY=ON) 
) 

INSERT INTO @temp (Y, M, D) 
VALUES 
    (2015, 10, 28), (2015, 10, 29), 
    (2015, 10, 29), (2015, 10, 30), 
    (2015, 10, 30), (2015, 10, 30), 
    (2015, 11, 4), (2015, 11, 5), 
    (2015, 11, 9), (2015, 11, 19), 
    (2016, 1 , 31), (2016, 4 , 1) 

; with cte as 
(
    select cast (cast (y as varchar(15)) +'-' + cast (m as varchar(15)) + '-' + cast (m as varchar(15)) as date) dt , y , m, d 
    from @temp 
) 
select top 1 y,m,d from cte order by dt desc 

delete @temp where y = '2016' 

; with cte as 
(
    select cast (cast (y as varchar(15)) +'-' + cast (m as varchar(15)) + '-' + cast (m as varchar(15)) as date) dt , y , m, d 
    from @temp 
) 
select top 1 y,m,d from cte order by dt desc 
0

Если вы уверены, что значения представляют собой действительные даты, вы можете конвертировать их в дату и получить MAX этого:

SELECT DATEPART(year, MAX(CAST(Y as varchar(4)) + RIGHT('0' + CAST(M AS varchar(2)), 2) + RIGHT('0' + CAST(D AS varchar(2)), 2))), 
    DATEPART(month, MAX(CAST(Y as varchar(4)) + RIGHT('0' + CAST(M AS varchar(2)), 2) + RIGHT('0' + CAST(D AS varchar(2)), 2))), 
    DATEPART(dd, MAX(CAST(Y as varchar(4)) + RIGHT('0' + CAST(M AS varchar(2)), 2) + RIGHT('0' + CAST(D AS varchar(2)), 2))) 
FROM @temp 
0

Вот запрос (замените имя таблицы)

SELECT TOP 1 YEAR, MONTH, DAY 
FROM YOUR_TABLE 
ORDER BY YEAR DESC, MONTH DESC, DAY DESC