2016-05-07 6 views
-1

В таблице у меня есть поле, содержащее дату в виде дд/мм/гггг:Найти ближайший срок до конца месяца для каждого месяца

TBL_Metrics: 
DATE | MetricValue 
03/02/2015 | 99.1% 
04/02/2015 | 97.3% 
03/03/2015 | 94.5% 
29/03/2015 | 93.6% 
07/04/2015 | 43.9% 
30/04/2015 | 94.2% 
... 

Я хотел бы построить код SQL, который будет выглядеть в все эти даты и:

  1. детектировать месяц даты
  2. в течение каждого месяца, обратите внимание на дату, которая ближе всего к концу месяца (в очень короткий пример выше, за февраль ближе дата к конец месяца - 04/02/2015)
  3. Заново использовать ближайшие даты в конце месяца в запросе выборки:

Выберите TBL_Metrics.Date, TBL_Metrics.MetricValue ОТ TBL_Metrics ГДЕ TBL_Metrics.Date в ('04/02/2015' , '29/03/2015' , „30/04/2015“)

Я понятия не имею, как это сделать в SQL, на данный момент я сделать это в VBA, но это заставляет меня иметь манекен таблицу с подключением к базе данных, чтобы сначала получить все даты, затем выполнить цикл во всех датах, чтобы найти ближайшую дату до конца месяца, а затем я могу построить мой запрос для использования в другом spreqdetheet, который является грязным.

Чтобы дать Вам идею здесь, как я нашел ближайшую дату к концу месяца в УВА:

dat1month = January 
dat2month = February 
dat3month = March 
For i = 2 To LR 
    If MonthName(Month(ActiveSheet.Cells(i, 3))) = dat1month Then 
     If ActiveSheet.Cells(i, 3) > Dat1max Then 
      Dat1max = ActiveSheet.Cells(i, 3) 
     End If 
    ElseIf MonthName(Month(ActiveSheet.Cells(i, 3))) = dat2month Then 
     If ActiveSheet.Cells(i, 3) > Dat2max Then 
      Dat2max = ActiveSheet.Cells(i, 3) 
     End If 
    ElseIf MonthName(Month(ActiveSheet.Cells(i, 3))) = dat3month Then 
     If ActiveSheet.Cells(i, 3) > Dat3max Then 
      Dat3max = ActiveSheet.Cells(i, 3) 
     End If 
    End If 
Next i 

Я надеюсь, что кто-то может помочь! Спасибо большое!

+0

Пожалуйста, измените вопрос, чтобы включить DDL соответствующей таблицы, некоторые выборочные данные (предпочтительно в виде заявлений DML) и желаемый результат. –

+0

Привет, Зоар, Извинения, надеюсь, теперь это яснее – tweedi

ответ

0

Вы можете использовать cte добавить row number колонки, чтобы помочь найти ближайший день до конца месяца, а затем запросить, что КТР:

;With cte as 
(
    SELECT Date, MetricValue, ROW_NUMBER() OVER(PARTITION BY YEAR(Date), MONTH(Date) ORDER BY Day(Date) DESC) rn 
    FROM TBL_Metrics 
) 

SELECT Date, MetricValue 
FROM cte 
WHERE rn = 1 
0

Если я правильно читать ваш вопрос, я думаю, вы можете использовать SQL функцию ранжирования ROW_NUMBER, чтобы помочь, как это ...

SELECT Date , 
     MetricValue 
FROM (
      SELECT Date , 
        MetricValue , 
        ROW_NUMBER() OVER PARTITION BY (YEAR(Date), MONTH(Date) ORDER BY Date DESC) 
      FROM TBL_Metrics 
     ) x 
Смежные вопросы