SAS proc sql сквозной запуск на неопределенный срок

#sql-server #sas #where-clause #proc-sql

#sql-сервер #sas #where-предложение #proc-sql

Вопрос:

У меня есть некоторые данные в формате неделя-дата-время, т.е. 14dec2020:00:00:00:000. Я использую SAS и сквозной запрос proc sql (SQL Server)

Эти данные содержат данные на много недель, но мне было любопытно, есть ли способ извлекать данные, относящиеся только к текущей неделе? Т.Е. сегодня 17dec2020, поэтому я бы хотел получать данные только за неделю 14dec2020. если бы сегодня было 22 декабря 2020 года, я бы хотел, чтобы он извлек данные за неделю 21 декабря 2020 года.

 Data macros;
    today = today();
    wkday = weekday(today);
    start = today()-(wkday-1);
    end = today (7-wkday);
    length cstart cend $22;
    cstart = "'" || put(start, date9.) || ':00:00:00.000' || "'";
    cend = "'" || put(end, date9.) || ':00:00:00.000' || "'";
    call symput ('start', cstart);
    call symput('end', cend);
run;
proc sql;  
    connect to odbc (dsn='x' uid='y' pwd='z');
    create table work.pleasehelp as select * from connection to odbc 
        (select Year, Month, Week, store, sales, SKU
            from datatable
            Where (amp;start. <= Week and week <= amp;end.)
            order by SKU);
    disconnect from odbc;
quit;
 

Набор данных макросов возвращает правильные границы даты, но когда он пытается запустить PROC SQL, он выполняется бесконечно. Я запускал его в течение 16 минут, и время работы процессора составляло всего 1,09 секунды. Я попытался изменить cstart и cend , чтобы просто запускать и завершать запросы, но это выполняется без совпадений.

Любая помощь здесь будет оценена!

Комментарии:

1. В чем заключается сквозной запуск? Oracle, SQL Server, MySQL и т.д…

2. SQL Server. Я обновлю это в своих заметках. Спасибо!

3.и каковы значения в datatable столбцах year month и week ? Являются ли они типами даты SQL Server, значения которых являются началом представленного интервала? Является datatable ли представление? Какой набор результатов вы увидите, если выполните тот же сквозной запрос в таком инструменте, как SQL Server Management Studio (SSMS)?

4. Извините за задержку ответа здесь с праздниками, но год — это четырехзначное число, месяц — цифра 1-12, а затем неделя — 14dec2020:00:00:00:000, упомянутый выше

Ответ №1:

Этот пример кода будет регистрировать, что представляет собой запрос, сгенерированный SAS для прохождения. Попробуйте выполнить тот же запрос с помощью инструмента SQL Server.

 %let start=;
%let end=;

data _null_;
    last_sunday = intnx('week', today(), 0);
    next_sunday = last_sunday   7;

    call symput('last_sunday', quote(put(last_sunday, yymmdd10.),"'")); 
    call symput('next_sunday', quote(put(next_sunday, yymmdd10.),"'")); 
run;

/* The source code in the macro variables is
   'yyyy-mm-dd'
   and will be understood by SQL Server to be an ISO8601 standard date value
 */
%put amp;=last_sunday;
%put amp;=next_sunday;

/* This macro has SQL NOEXEC so you can see in the LOG window what
   the pass through query is.  Try running the same query in a
   SQL Server tool to see what the expected result set is
 */

%macro query;

proc sql noexec;
    connect to odbc (dsn=x uid=y pwd=z);
    create table work.pleasehelp as
    select * from connection to odbc
    ( select Year, Month, Week, store, sales, SKU
      from datatable
      where amp;last_sunday <= Week and Week < amp;next_sunday
            order by SKU
        );
    disconnect from odbc;
quit;

%mend;

options mprint;
%query;
 

Окно журнала

 MPRINT(QUERY):   create table work.pleasehelp as select * from connection to odbc ( 
 

select Year,
Month, Week, store, sales, SKU from datatable where '2020-12-27' <= Week and Week < '2021-01-03'
order by SKU

  );
NOTE: Statement not executed due to NOEXEC option.