我有一个teradata表,其中有大约1000万条记录,它将数字id字段存储为varchar.我需要将此字段中的值传输到另一个表中的bigint列,但我不能简单地说cast(id_field为bigint)因为我得到了无效的字符错误.通过查看值,我发现字符串中的任何位置都可能有一个字符,所以让我们说字符串是varchar(18)我可以过滤掉无效的行,如下所示:
where substr(id_field,1,1) not in (/*big,ugly array of non-numeric chars*/)
and substr(id_field,2,1) not in (/*big,ugly array of non-numeric chars*/)
etc, etc...
Run Code Online (Sandbox Code Playgroud)
演员会工作,但从长远来看这是不可行的.它很慢,如果字符串有18个可能的字符,它会使查询不可读.如何在不使用非数字字符数组单独检查每个字符的情况下过滤掉在此字段中具有值而不会作为bigint转换的行?
示例值将是
123abc464
a2.3v65
a_356087
........
000000000
BOB KNIGHT
1235468099
Run Code Online (Sandbox Code Playgroud)
值不遵循特定的模式,我只需要过滤掉包含任何非数字数据的值.123456789没问题,但123.abc_c3865不是......
编辑:这是一套更完整的代码,可以根据下面的答案准确显示正在进行的操作.
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 …
我正在尝试编写代码,允许我检查表中是否存在特定模式的任何情况.
我目前正在做的方式就是这样
select count(*)
from database.table
where column like (some pattern)
Run Code Online (Sandbox Code Playgroud)
并查看计数是否大于0.
我很想知道是否有任何方法可以加快这个过程,因为这种类型的模式发现发生在我的查询循环中,我需要知道的是,是否有一个这样的情况而不是案例总数.
任何建议将不胜感激.
编辑:我在Teradata存储过程中运行它以进行数据质量验证.
我有像这些'有'的弧/边:
Node1 Node2
A B
B C
D E
Run Code Online (Sandbox Code Playgroud)
这里A连接到B和B连接到C.D连接到E.换句话说,这些'想要'中显示了2个组/簇:
Node1 Node2 Cluster
A B 1
B C 1
D E 2
Run Code Online (Sandbox Code Playgroud)
我可以使用SQL来识别这些组/集群吗?我想这涉及自联接,但我看不出如何编写这个SQL.任何反馈都将非常感激.谢谢!
我需要使用 select 语句提取行 ID。类似于 oracle 的行 ID 的东西。我将如何在 Teradata 中做到这一点?我正在尝试以下查询,但它抛出错误。
select rowid,emp_id,e_name from test;
Error msg : Syntax error: ROWID not allowed.
Run Code Online (Sandbox Code Playgroud)
提前致谢。
我是 Teradata 的新手,我遇到了以前使用的数据库没有的问题。基本上,我试图减少在 where 子句中的子查询中返回的行数。我以前使用 ROWNUM 函数执行此操作没有问题。
我以前的查询是这样的:
SELECT * FROM myTable
WHERE field1 = 'foo' AND field2 in(
SELECT field2 FROM anotherTable
WHERE field3 = 'bar' AND ROWNUM<100);
Run Code Online (Sandbox Code Playgroud)
因为我不能在 TD 中使用 ROWNUM,所以我一直在寻找等效的函数,或者至少可以找到我想要的函数,即使它们不完全等效。我找到并尝试了:ROW_NUMBER、TOP 和 SAMPLE。
我尝试过 ROW_NUMBER() 但 Teradata 不允许在 WHERE 子句中使用分析函数。我尝试了 TOP N,但子查询不支持此选项。我尝试了 SAMPLE N,但子查询也不支持它。
所以...我不得不承认我现在有点卡住了,想知道是否有任何解决方案可以让我使用 Teradata 限制子查询中返回的行数,这与我所做的非常相似到现在?此外,如果没有,如何以不同的方式构建查询以适当地与 Teradata 一起使用?
谢谢!
无论如何我可以将teradata连接到nodejs服务器吗?我有一个用例,我需要在我的其余 API 中提取 teradata 信息。
我可以使用这个npm 包吗?
我有一份在不同州做生意的商人名单。
Merch State
A NC
A FL
B CA
B VA
Run Code Online (Sandbox Code Playgroud)
我不想返回四个记录,而是想按商品分组,但连接状态的字符串,以便输出看起来像
Merch States
A NC,FL
B CA,VA
Run Code Online (Sandbox Code Playgroud)
我在翻译这个答案中针对我的问题的响应时遇到了很多麻烦 连接/聚合字符串的最佳方式
我也无法让 String_agg 工作,我不确定它在 Teradata 中是否工作。https://learn.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql
我正在从SSIS导出数据,并且在我的项目之一中出现截断错误:
[TH27 [91]]错误:“发生了截断错误。列名是'mydate'。”
在输入(Teradata)中,我有一列类型timestamp(6),在SQL Server的输出中,我有一列类型datetime。
如何以使用SSIS时不会出现此类错误的方式进行转换?
我的尝试(请求1):
SELECT
column1,
CAST(CAST(CAST(mydate AS DATE FORMAT 'YYYY-MM-DD') AS CHAR(10)) || ' '
|| TRIM(EXTRACT(HOUR FROM (mydate))) || ':'
|| TRIM(EXTRACT(MINUTE FROM (mydate))) || ':'
|| TRIM(CAST(EXTRACT(SECOND FROM (mydate)) AS INTEGER)) AS Date) AS mydate,
column2
FROM table1
Run Code Online (Sandbox Code Playgroud)
更新:
我写的请求在Teradata源中,这是我的SSIS模式的示例
我的表有问题,我想使用 group by 连接字符串字段。我这里有这种情况:
USER | TEXT
A | 'hello'
A | 'by'
B | 'hi'
B | '9'
B | 'city'
Run Code Online (Sandbox Code Playgroud)
我想得到这个结果:
USER | TEXT
A | 'hello by'
B | 'hi 9 city'
Run Code Online (Sandbox Code Playgroud)