Как объединить таблицу из двух столбцов, выбрав максимальное значение? SQL Сервер - PullRequest
0 голосов
/ 16 июня 2020

Я работаю над представлением и у меня есть следующая таблица, которую я пытаюсь изменить. (SQL Сервер)

Таблица X

ID    Value  End_time
1     10     2019-12-06T07:00:00+0000
2     15     2020-01-07T07:00:00+0000
2     20     2020-01-31T07:00:00+0000
3     25     2020-02-02T07:00:00+0000
3     30     2020-02-28T07:00:00+0000
4     35     2020-03-05T07:00:00+0000
4     40     2020-03-31T07:00:00+0000

[End_time] должно быть преобразовано из varchar в дату и дополнительный разделитель по месяцам и годам, затем я должен выбрать максимальное date и сгруппировать данные по году и месяцу.

Итак, я делаю следующий запрос:

SELECT        [ID], [Value], CONVERT(date, LEFT([End_time], LEN([End_time]) - 14)) AS [date], 
              -- convert to date

              MONTH(CONVERT(date, LEFT([End_time], LEN([End_time]) - 14))) AS Month_Name, --get month
              YEAR(CONVERT(date, LEFT([End_time], LEN([End_time]) - 14))) AS Year_Name --get year
FROM            X AS Table 
                INNER JOIN --join on itself
                (SELECT MAX([date]) AS MaxDate, MONTH([date]) AS Month_Name, YEAR(date) AS Year_Name
                 FROM X
                 GROUP BY MONTH([date]), YEAR([date])) AS D ON D.MaxDate = CONVERT(date, 
                                                         LEFT([End_time], LEN([End_time]) - 14))

Но я получаю сообщение об ошибке, что такого столбца, как date, нет. Я пробовал присоединиться вот так:

INNER JOIN --join on itself
                    (SELECT MAX(CONVERT(date, LEFT([End_time], LEN([End_time]) - 14))) AS MaxDate, 
                     MONTH([date]) AS Month_Name, YEAR(date) AS Year_Name
                     FROM X
                     GROUP BY MONTH([date]), YEAR([date])) AS D ON D.MaxDate = CONVERT(date, 
                                                             LEFT([End_time], LEN([End_time]) - 14))

Но потом я получаю сообщение об ошибке: Многокомпонентный идентификатор «X.End_time» не может быть привязан.

Итак, мой идеальный результат

ID    Value  Month_Name Year_Name
1     10     12         2019
2     35     01         2020
3     55     02         2020
4     75     03         2020

Ответы [ 2 ]

0 голосов
/ 16 июня 2020
SELECT MAX([table_alias.ID]), 
       SUM([table_alias.VALUE]), 
       [table_alias.Month_Name], 
       [table_alias.Year_Name]
FROM ( SELECT  [ID], [Value], 
        MONTH(CONVERT(date, LEFT([End_time], LEN([End_time]) - 14))) AS Month_Name,
        YEAR(CONVERT(date, LEFT([End_time], LEN([End_time]) - 14))) AS Year_Name 
FROM  X) AS table_alias 
group by [table_alias.Month_Name], 
       [table_alias.Year_Name] 
0 голосов
/ 16 июня 2020

Я бы просто использовал:

select id, value,
       substring(endtime, 5, 2) as month,
       left(endtime, 4) as year
from (select t.*,
             row_number() over (partition by id order by endtime desc) as seqnum
      from x
     ) x
where seqnum = 1;

Хотя сохранение значения даты / времени в виде строки - плохой выбор представления, вы, по крайней мере, выбрали очень хороший формат для строки. Вы можете просто упорядочить по строке, чтобы получить самую последнюю или самую старую строку.

...