2015-12-10 3 views
1

Мне нужно собрать данные из базы данных на основе создания месяца.Соберите данные максимального месяца

enter image description here

В моем случае

а. month_val - индивидуальный месяц

б. cur_month последнее обновление месяца

Каждый месяц (cur_month) мои пользователи могут обновлять данные за любые месяцы (month_val).

Пример вывода:

enter image description here

запрос должен возвращать только последние данные месяц.

С января месяца (cur_month 1) Я добавил данные для Jan, Feb, который month_val 1,2

В феврале месяце (cur_month 2) Я добавил данные Feb, Mar, который является month_val 2,3

...

в декабре месяце (cur_month 12) Я добавил данные Mar, который month_val 3.

enter image description here

На основе этих сохраненных данных. Мне нужно собрать последние (отмеченные зелеными) month_val на основе cur_month

Надеюсь, что я четко объяснил свою проблему.

Я пытался таким образом

SELECT * FROM proj_duration_map where cur_month=max(cur_month) 

плохо не работает

+1

Какие базы данных вы используете, MySQL или SQL Server? –

+0

Вы хотите сказать, что запрос может получить последний cur_month? Например, year_val & cur_month = '2016-12'. –

+2

Это будет плохой выбор столбцов столбцов. – Drew

ответ

1

Я думаю, вы должны GROUP BY 4 первых столбца.

В MSSQL, вы можете использовать ROW_NUMBER выбрать MAXMONTH

SELECT * FROM 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER(PARTITION BY pid, week_val, month_val, year_val 
         ORDER BY cur_month DESC) AS RN 
    FROM proj_duration_map 
) AS A 
WHERE RN = 1 --choose MAX cur_month (ORDER DESC) 

В MySQL, вы можете использовать COUNT вместо ROW_NUMBER

SELECT * FROM (
    SELECT A.pid, A.week_val, A.month_val, A.year_val, A.cur_month, 
      Count(*) as RN 
    FROM proj_duration_map A 
    INNER JOIN proj_duration_map B 
     ON A.pid = B.pid 
     AND A.week_val = B.week_val 
     AND A.month_val = B.month_val 
     AND A.year_val = B.year_val 
     AND A.cur_month >= B.cur_month 
    GROUP BY A.pid, A.week_val, A.month_val, A.year_val, A.cur_month 
) AS C 
WHERE RN = 1 
+0

Если он использует MySQL, раздел аналитической функции не поддерживается – Bee157

+0

Я добавляю MySQL мой код, tks –

+0

Я обновил свой вопрос еще раз – ManiMuthuPandi

0
SELECT month_val, year_val, cur_month FROM proj_duration_map 
    where cur_month=max(cur_month) 
    group by month_val, year_val, cur_month 

список полей в SELECT, должны быть такими же, как и GROUP BY.

+0

Я заплачу вам, чтобы не писать такой код: P – Drew

+0

Я знаю, что это вызовет проблемы с производительностью: p –

+0

ваш запрос возвращает только данные за декабрь (12), мне нужны все последние данные. – ManiMuthuPandi

Смежные вопросы