#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
У меня есть этот запрос в Microsoft SQL Server:
SELECT *
FROM
(SELECT 0 run_id,
0 tran_id,
0 sort_id,
' ' tran_type,
10 prod_id,
72 type_id,
1 value,
CONVERT(DATETIME ,'2016-03-18 00:00:00', 102) row_number() OVER (ORDER BY (SELECT NULL)) -1 convert(varchar(8), sw.end_time, 8) event_publication,
DATEPART (YEAR
FROM (CONVERT(DATETIME, '2016-03-18 00:00:00', 102) row_number() OVER (ORDER BY (SELECT NULL)) -1)) y,
DATEPART (MONTH
FROM (CONVERT(DATETIME, '2016-03-18 00:00:00', 102) row_number() OVER (ORDER BY (SELECT NULL)) -1)) mo,
DATEPART (DAY
FROM (CONVERT(DATETIME, '2016-03-18 00:00:00', 102) row_number() OVER (ORDER BY (SELECT NULL)) -1)) d,
datepart (hour from sw.end_time) h,
datepart (minute from sw.end_time) mi,
datepart (second from sw.end_time) s,
0 ms
FROM sys.all_objects ao,
settlement_win sw,
prod_def pd
WHERE pd.prod_id = 10
AND sw.country = pd.country
AND sw.commodity = pd.commodity
AND row_number() OVER (ORDER BY (SELECT NULL)) <= CONVERT(DATETIME, '2016-03-18 23:59:00', 102) -CONVERT(DATETIME, '2016-03-18 00:00:00', 102) 1
)AS A WHERE 1=1
AND event_publication >= CONVERT(VARCHAR(19), '2016-03-18 00:00:00', 20)
AND event_publication <= CONVERT(VARCHAR(19), '2016-03-18 23:59:00', 20)
ORDER BY run_id,
prod_id,
type_id,
y,
mo,
d,
h,
mi,
s,
ms,
sort_id,
tran_id,
value;
Когда я выполняю его в Microsoft SQL Server Management Studio, я получаю эту ошибку:
Сообщение 4108, уровень 15, состояние 1, строка 27
Оконные функции могут отображаться только в предложениях SELECT или ORDER BY .
из-за строки AND row_number() OVER (ORDER BY (SELECT NULL)) <= CONVERT(DATETIME, '2016-03-18 23:59:00', 102) -CONVERT(DATETIME, '2016-03-18 00:00:00', 102) 1
я не смог найти обходной путь, который работает и для моего запроса.
Комментарии:
1. Используйте подзапрос или CTE.
Ответ №1:
вы не можете использовать функцию window в предложении where, но вы можете проверить это на следующем уровне в подзапросе или cte
SELECT *
FROM
(SELECT 0 run_id,
0 tran_id,
0 sort_id,
' ' tran_type,
10 prod_id,
72 type_id,
1 value,
CONVERT(DATETIME ,'2016-03-18 00:00:00', 102) row_number() OVER (ORDER BY (SELECT NULL)) -1 convert(varchar(8), sw.end_time, 8) event_publication,
DATEPART (YEAR
FROM (CONVERT(DATETIME, '2016-03-18 00:00:00', 102) row_number() OVER (ORDER BY (SELECT NULL)) -1)) y,
DATEPART (MONTH
FROM (CONVERT(DATETIME, '2016-03-18 00:00:00', 102) row_number() OVER (ORDER BY (SELECT NULL)) -1)) mo,
DATEPART (DAY
FROM (CONVERT(DATETIME, '2016-03-18 00:00:00', 102) row_number() OVER (ORDER BY (SELECT NULL)) -1)) d,
datepart (hour from sw.end_time) h,
datepart (minute from sw.end_time) mi,
datepart (second from sw.end_time) s,
0 ms
,row_number() OVER (ORDER BY (SELECT NULL)) as rn
FROM sys.all_objects ao,
settlement_win sw,
prod_def pd
WHERE pd.prod_id = 10
AND sw.country = pd.country
AND sw.commodity = pd.commodity
)AS A WHERE 1=1
AND event_publication >= CONVERT(VARCHAR(19), '2016-03-18 00:00:00', 20)
AND event_publication <= CONVERT(VARCHAR(19), '2016-03-18 23:59:00', 20)
AND rn <= CONVERT(DATETIME, '2016-03-18 23:59:00', 102) -CONVERT(DATETIME, '2016-03-18 00:00:00', 102) 1
ORDER BY run_id,
prod_id,
type_id,
y,
mo,
d,
h,
mi,
s,
ms,
sort_id,
tran_id,
value;