2016-09-29 1 views
0

В настоящее время у меня есть запрос T-SQL, который вытаскивает список исторических дат счета и задерживает дату с 2 по последний счет с использованием временной таблицы. Дело в том, что мне нужно использовать этот запрос в предварительном процессоре в стороннем приложении, которое не работает с использованием создания и отбрасывания временных таблиц. Есть ли способ написать следующий запрос T-SQL без использования таблицы View или Temp?T-SQL Query for Max Date меньше 1 (без таблицы просмотра или временной таблицы)

SELECT (convert(CHAR(10), dateadd(dd, DateDiff(dd, 0, ltradat), 0), 126)) AS 'DateOnly' 
INTO #temp 
FROM matter WITH (NOLOCK) 
    ,ledger WITH (NOLOCK) 
WHERE mclient = '014134' 
    AND lmatter = mmatter 
    AND lzero != 'R' 
    AND mcurrency LIKE '%' 
    AND llcode != 'PAY' 
GROUP BY ltradat 
ORDER BY ltradat 

SELECT max(DateOnly) 
FROM #temp 
WHERE DateOnly < (
     SELECT max(DateOnly) 
     FROM #Temp 
     ) 

DROP TABLE #temp 

В таблице #Temp приведен список дат выставления счетов и вопросов, связанных с этими фактурами. В элементе select указывается только одна дата счета меньше 1 из списка (отсортировано от самого раннего к самому текущему).

Если я выбираю * от #Temp, я получаю список как:

2016-06-08 
2016-07-12 
2016-07-26 
2016-08-05 
2016-09-12 

Когда я запускаю заключительную часть запроса T-SQL, я получаю результат, что я требую от:

2016-08-05 

Возможно ли получить этот результат из одного запроса без таблицы TEMP или VIEW?

Заранее спасибо.

-Nick

+0

Таблица переменных? КТР? Создать промежуточную таблицу, которую вы усекаете в начале/конце запроса? – dfundako

ответ

1

Вы можете использовать подзапрос вместо временных таблиц или представлений, чтобы получить 2-ую самую последнюю дату? Как

SELECT MAX(DateOnly) 
    FROM (
      SELECT TOP 2 (convert(CHAR(10), dateadd(dd, DateDiff(dd, 0, ltradat), 0), 126)) AS DateOnly 
      FROM matter WITH (NOLOCK) 
       ,ledger WITH (NOLOCK) 
      WHERE mclient = '014134' 
       AND lmatter = mmatter 
       AND lzero != 'R' 
       AND mcurrency LIKE '%' 
       AND llcode != 'PAY' 
      GROUP BY ltradat 
      ORDER BY ltradat 
     ) AS b 
+0

Это сработало для меня, как только я сменил заказ на ORDER BY ltradat DESC – NCollinsTE