Как сделать запрос о максимальном месяце / году группы столбцов - PullRequest
0 голосов
/ 23 мая 2019

Я действительно не знаю, как сделать запрос MySQL, где я получаю все данные (столбцы) за самый последний месяц + год.

Будучи более конкретным, мне нужно сгруппировать столбцы (описание, данные1, данные2, данные3) и получить только тот, который имеет самый высокий месяц + год.

Таблица содержит следующие данные:

description     data1   data2   data3   year    month   adddate
desc1           0       7       1       2019    5       2019-05-23
desc2           0       7       1       2019    5       2019-05-23
desc3           1       7       1       2019    5       2019-05-23
desc4           0       2       1       2018    12      2019-05-23

Я пытался использовать max для месяца, года и дополнения.

select description, data1, data2, data3, max(year) as year, max(month) as month, max(adddate) as adddate
            from tabledata
            group by description, data1, data2, data3

Но при этом я получаю, что максимальный регистр равен desc2 с месяцем 12, что неверно, поскольку месяц os desc2 равен 6.

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Вам нужно получить максимальное значение выражения вроде:

100 * year + month

или

12 * year + month

Так сделайте это:

select *
from tabledata
where 100 * year + month = (
  select max(100 * year + month)
  from tabledata
)

См. Демоверсию .
Результаты:

> description | data1 | data2 | data3 | year | month | adddate            
> :---------- | ----: | ----: | ----: | ---: | ----: | :---------
> desc1       |     0 |     7 |     1 | 2019 |     5 | 23/05/2019
> desc2       |     0 |     7 |     1 | 2019 |     5 | 23/05/2019
> desc3       |     1 |     7 |     1 | 2019 |     5 | 23/05/2019
0 голосов
/ 24 мая 2019

Вам нужно найти максимальную комбинацию года и месяца (MaxYearMonth) и затем снова присоединиться к вашей таблице, чтобы найти все строки, соответствующие этому MaxYearMonth.Вот решение для SQL Server ...

IF OBJECT_ID('tempdb.dbo.#tabledata', 'U') IS NOT NULL DROP TABLE #tabledata; 

CREATE TABLE #tabledata
(
    description VARCHAR(10)
  , data1 INT
  , data2 INT
  , data3 INT
  , year INT
  , month INT
  , adddate DATE
);

INSERT INTO #tabledata VALUES ('desc1', 0, 7, 1, 2019, 5, '2019-05-23')
INSERT INTO #tabledata VALUES ('desc2', 0, 7, 1, 2019, 5, '2019-05-23')
INSERT INTO #tabledata VALUES ('desc3', 1, 7, 1, 2019, 5, '2019-05-23')
INSERT INTO #tabledata VALUES ('desc4', 0, 2, 1, 2018, 12, '2019-05-23')

select a.description, a.data1, a.data2, a.data3
from #tabledata a 
inner join 
(
   select max(convert(char(4), year) + right('0' + convert(varchar(2), month), 2)) as [MaxYearMonth]
   from #tabledata
) b on convert(char(4), a.year) + right('0' + convert(varchar(2), a.month), 2) = b.MaxYearMonth

Даёт это ...

description data1       data2       data3
----------- ----------- ----------- -----------
desc1       0           7           1
desc2       0           7           1
desc3       1           7           1

Нажмите здесь , чтобы увидеть его в действии.

Вы упомянули "mysql", поэтому, если вы действительно используете mySQL, то синтаксис, вероятно, потребуется немного изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...