Используйте ROW_NUMBER () в предложении WHERE в SQL Server - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть этот запрос в 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 Ответ

1 голос
/ 11 апреля 2019

вы не можете использовать функцию окна в предложении 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...