#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.