编辑:这是一套更完整的代码,可以根据下面的答案准确显示正在进行的操作.
libname output '/data/files/jeff'
%let DateStart = '01Jan2013'd;
%let DateEnd = '01Jun2013'd;
proc sql;
CREATE TABLE output.id AS (
SELECT DISTINCT id
FROM mydb.sale_volume AS sv
WHERE sv.category IN ('a', 'b', 'c') AND
sv.trans_date BETWEEN &DateStart AND &DateEnd
)
CREATE TABLE output.sums AS (
SELECT id, SUM(sales)
FROM mydb.sale_volue AS sv
INNER JOIN output.id AS ids
ON ids.id = sv.id
WHERE sv.trans_date BETWEEN &DateStart AND &DateEnd
GROUP BY id
)
run;
Run Code Online (Sandbox Code Playgroud)
目标是根据类别成员资格在表中查询某些id.然后,我将这些成员的活动汇总到所有类别.
上述方法远比以下方法慢:
如果我理解正确,确保我的所有代码都完全通过而不是交叉加载可能更有效.
在昨天发布一个问题之后,一位成员建议我可以通过提出一个更具体针对我的情况的单独的绩效问题而受益.
我正在使用SAS Enterprise …
我正在使用SAS proc sql查询并发现了一些奇怪的东西.首先,我尝试了这个简单的查询:
proc sql;
CREATE TABLE test AS
(SELECT
YEAR(dt) AS yr,
MONTH(dt) AS mo,
SUM(val) AS total
FROM
mydb1234.myTable
WHERE
myDate BETWEEN x AND y
GROUP BY
yr, mo);
run;
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时,我收到此错误:
ERROR: Teradata row not delivered (trget): Numeric overflow occurred during computation.
Run Code Online (Sandbox Code Playgroud)
据我所知,当我的求和值太大而无法适应proc sql试图使用的数据类型时,会发生这种情况.
我决定将我总结的数字除以:
SUM(val/1000) AS total
Run Code Online (Sandbox Code Playgroud)
但是,这会产生意想不到的后果.总和小于我在Excel中所做的手动总和.随着我向除数增加更多的数量级,总数会降低.我猜这是消除它试图求和的较小值(例如10/1000 vs 108/10000等),它们永远不会达到总和,而是被读作零.
有没有办法强制这个proc sql使用可以容纳我的总值的字段长度创建一个表?它们的数量在十亿 - 千亿之间,所以我认为这并不奇怪.我很想知道你们的想法.
@Greg Snow非常友好地向我介绍了使用正则表达式进行模式匹配.我用他的建议来执行以下操作:
sql <- "SELECT a, b, (q + r) AS c, (s + t) AS d FROM tbl WHERE x=y"
sql <- gsub("^.*SELECT *(.*?) +FROM.*$", "\\1", sql)
"a, b, (q + r) AS c, (s + t) AS d"
Run Code Online (Sandbox Code Playgroud)
我很好奇,并试图扩展这个逻辑来取代"逗号之后的所有内容,包括'AS':
sql<- gsub(" \\(.*AS", "\\1", sql)
"a, b, d"
Run Code Online (Sandbox Code Playgroud)
我希望它返回"a,b,c,d".但是,我看到发生了什么 - 它在整个字符串中匹配我的模式,以"b"之后的逗号开头,并以第二个AS结束,而不是第一个AS.
我的问题是,如何在同一个字符串中多次匹配模式?我知道我在做错了语法.
我有以下脚本,我收到VLOOKUP错误:
Dim DataRange, LookupRange As Range
Dim Data, Test As Variant
Set DataRange = Sheets("sheet").Range("A1:K12000")
Set LookupRange = sheets("sheet2").Range("A1:C50")
Data = DataRange.Value
For i = LBound(Data, 1) To UBound(Data,1)
ReDim Preserve Test(1 To 3, 1 To i)
test(1, i) = Application.WorksheetFunction.VLookup(Data(i, 4), LookupRange, 3, 0)
'Other stuff works fine
Next i
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到错误说明:
"Unable to get the VLookup property of the WorksheetFunction class"
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为所有变量和范围在监视模式下都很好.查询也是字母...任何想法发生了什么?
我有一个字符串:
s <- "test.test AS field1, ablh.blah AS field2, faslk.lsdf AS field3"
Run Code Online (Sandbox Code Playgroud)
我想转换为:
"field1, field2, field3"
Run Code Online (Sandbox Code Playgroud)
我知道正则表达式(\w+)(?:,|$)将提取我想要的字符串('field1,'等),但我无法弄清楚如何提取它gsub.
是否可以不从 Notepad++ 复制换行符?例如,我正在为 ODBC 连接和 SQL 查询编写一些 R 代码。我想像这样在 Notepad++ 中格式化查询:
SELECT
field1,
field2,
FROM
tblXyx
Run Code Online (Sandbox Code Playgroud)
但是,当我将其粘贴到 R 中时,它也会粘贴换行符。有没有办法只复制字符串而不包含换行符?我传递给字符串的实际查询很长,所以我想在 Notepad++ 中出于可读性原因对其进行格式化(而不是只有一行。)
我正在为Teradata编写SQL.我需要使用连接来连接多个表中的数据.通常使用子查询或创建临时表并一次追加一个连接列更快吗?我正在尝试自己测试,但网络流量使我很难分辨哪个更快.
例A:
SELECT a.ID, a.Date, b.Gender, c.Age
FROM mainTable AS a
LEFT JOIN (subquery 1) AS b ON b.ID = a.ID
LEFT JOIN (subquery 2) AS c ON c.ID = a.ID
Run Code Online (Sandbox Code Playgroud)
或者我可以......
例B:
CREATE TABLE a AS (
SELECT mainTable.ID, mainTable.Date, sq.Gender
FROM mainTable
LEFT JOIN (subquery 1) AS sq ON sq.id = mainTable.ID
)
CREATE TABLE b AS (
SELECT a.ID, a.Date, a.Gender, sq.Age
FROM a
LEFT JOIN (subquery 2) AS sq ON sq.id = a.ID
)
Run Code Online (Sandbox Code Playgroud)
假设我之后清理了所有东西,一种方法比另一种更好吗?再一次,我想自己测试一下,但网络流量有点让我感到困惑.
编辑: …
假设我有一个返回如下值的查询:
id type value
aaa 1a 10
aaa 1b 20
aaa 1c 7
bbb 2a 10
bbb 1a 5
Run Code Online (Sandbox Code Playgroud)
有超过5000万行和240种可能的"类型".我想建立一个枢轴,每个id都有一行,每个type都是它自己的列:
id 1a 1b 1c 2a
aaa 10 20 7
bbb 5 10
Run Code Online (Sandbox Code Playgroud)
我可以在SQL服务器中执行此操作,但我不知道如何在Teradata中执行此操作.制作CASE语句的列数太多了.但是,每个不同的type都在表字段中,如果有任何帮助的话.
以下是反映取得的一些进展的编辑:
我有以下功能有效:
proc fcmp outlib=mydir;
function sqlWhere(interval $, myDate $) $;
...
return("id");
endsub;
quit;
Run Code Online (Sandbox Code Playgroud)
这已经过测试并且工作正常。所以我试过:
%macro sqlWhere(interval, myDate);
&interval.("year") AS t
&myDate.("someDateField") AS tt
%mend;
proc sql;
CREATE TABLE test AS (
SELECT %sqlWhere(t, tt)
FROM myTable);
quit;
Run Code Online (Sandbox Code Playgroud)
当我运行选择时,顶部运行良好。但是,proc sql 崩溃并说我缺少一个逗号。我很困惑,因为该函数在其他应该使代码工作的测试中返回“id”。错误说“tt”部分缺少逗号...
我正在尝试在 SAS 中进行动态查询。我有几个问题,我不确定我想做的事情是否可行。另外,很抱歉删除了先前的问题;我想给出一个更好的解释。
说我有这个代码:
proc sql;
SELECT
YEAR(myDate) AS yr,
MONTH(myDate) AS mo,
id
FROM
myTable;
run;
Run Code Online (Sandbox Code Playgroud)
我试图让它有条件。这带来了两个问题。首先,我无法使用基本语法。其次,我无法让我的自定义函数创建正确的字符串。
我想要这样的东西:
%let a = sqlDate("month");
proc sql;
SELECT
&a
FROM
myTable;
run;
Run Code Online (Sandbox Code Playgroud)
这种结构不起作用,即使我放弃该功能并直接输入
%let a = "YEAR(myDate) AS yr, MONTH(myMonth) …Run Code Online (Sandbox Code Playgroud) 我有一个存储在R中的字符串.我可以使用哪些代码来提取两个值之间的文本?例如:
sql <- "SELECT field1, field2, field3 FROM tbl WHERE x=y"
Run Code Online (Sandbox Code Playgroud)
我想提取field1, field2, field3为一个单独的字符串.我可以使用,substring但我不清楚如何确定与"SELECT"结束和"FROM"开始相关的整数值.