在我的新公司,他们将与数据仓库相关的所有数据(包括导入、暂存、审计、维度和事实表)保存在同一个物理数据库中。
我已经成为数据库开发人员多年了,这种功能和形式的整合似乎与我所知道的一切背道而驰。
它似乎使安全、备份/恢复和性能管理问题更加需要人工处理。
这是行业内的做法吗?是否有充分的理由去做或不做?
该平台是 Netezza。大小以 TB 为单位,数亿行。
我希望从这个问题的答案中得到的是对这条道路是对是错的深刻理解。根据您的经验,如果这是一条会给我们带来麻烦的道路,我应该重点讨论哪些问题。如果这没什么大不了的,那么我也想知道。
我正在尝试将SQL 11从Oracle 11 G移植到Netezza.
这是我在Oracle中的查询:
SELECT
ID, TEACHERID, CLASS, SECTION, MAJOR, SUPERVISOR, COURSE, SCORE, SCOREDATE,
(select SCORE from STUDENT_SCORES d2 where d2.ID=d1.ID and d2.SCOREDATE (d1.SCOREDATE)-28 and d1.COURSE=d2.COURSE) as PRIORSCORE,
(d1.SCOREDATE)-28 as PRIORSCOREDT,
REMCD
FROM
STUDENT_SCORES d1
WHERE
TEACHERID='T1' AND SCOREDATE=(SELECT MAX(SCOREDATE) FROM STUDENT_SCORES WHERE TEACHERID='T1')
Run Code Online (Sandbox Code Playgroud)
当我在Netezza中运行它时出现错误:
ERROR: (2) This form of correlated query is not supported - consider rewriting
Run Code Online (Sandbox Code Playgroud)
如何为Netezza重写此查询?请帮忙.
以下是使用的序列创建语法:
CREATE SEQUENCE BD_ID_SEQ AS INTEGER
START WITH 999
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
NO CYCLE;
Run Code Online (Sandbox Code Playgroud)
我有一个包含以下值记录的表:
b_id ------- 2547 NULL 2800 NULL NULL NULL NULL
我执行以下操作:
select case
when b_id is NULL then cast((select next value for bd_id_seq) as character varying(10))
else b_id
end b_id
from table1;
Run Code Online (Sandbox Code Playgroud)
结果是:
b_id ------- 2547 1000 2800 1000 1000 1000 1000
我在期待:
2547 1000 2800 1001 1002 1003 1004
任何想法为什么在case语句中序列似乎没有增加超过第一个值?谢谢,金妮
我是 SQL 新手,一直在寻找一种在 ANSI SQL 中设置变量的方法。我有这个:
select * from table1
where first_date > '2014-01-01'
and where second_date = '2014-01-01'
and where third_date < '2014-01-01'
Run Code Online (Sandbox Code Playgroud)
但我希望有这样的事情:
set x = '2010-12-31'
select * from table1
where first_date > x
and where second_date = x
and where third_date < x
Run Code Online (Sandbox Code Playgroud)
我读过有关存储过程的内容,但对于看似简单的事情来说,这似乎有点矫枉过正。我正在 Netezza 上运行,但我想要一个也可以在其他数据库上运行的通用解决方案。
我需要在win 7上从Aginity workbench在IBM netezza sql数据库中找到一个表大小.
我用过这个
SELECT * FROM _V_TABLE
where tablename = 'my_table_name'
Run Code Online (Sandbox Code Playgroud)
但是,没有关于表大小的信息.
我在Aginity中右键单击了表名,但是没有任何结果.
任何帮助,将不胜感激.
谢谢
我想把今天的日期加上过去四个星期。有没有人知道 Netezza 中的这个功能?我下面的猜测是行不通的。另外,我不想提取日期。
Select c.BUSINESS_UNIT_NBR, c.BUSINESS_UNIT_NAME, b.STORE_NBR, b.INV_CUST_ACNT_NBR,c.INV_CUST_NAME, a.NDC_NBR, a.GENERIC_NAME, a.INV_NBR, a.CONTRACT_ID, a.CONTRACT_NAME, a.ORD_DT, b.INV_DT, b.SHIP_DT, a.ORD_QTY, a.SHIPPED_QTY, a.INV_PRICE_AMT, a.INV_COST_AMT, a.MARKUP_MARKDOWN_PCT, a.INV_LINE_AMT
from fct_dly_invoice_detail a, fct_dly_invoice_header b, dim_invoice_customer c
where a.INV_HDR_SK = b.INV_HDR_SK
and b.DIM_INV_CUST_SK = c.DIM_INV_CUST_SK
and a.SRC_SYS_CD = 'ABC'
and a.NDC_NBR is not null
**and b.inv_dt(current_date)-16**
and b.store_nbr in (813, 1197, 2771, 3048, 3177, 3387, 3477, 3602, 3766, 3912, 4020, 4138, 4228, 4434, 4435, 4507, 4742, 4791, 5353, 5392, 5775, 5776, 5890, 6177, 6692, 6736, 6806, 7933, 9175, …Run Code Online (Sandbox Code Playgroud) 我希望将我的工作流程从 SAS 更改为 Python,到目前为止,除了一件非常重要的事情之外,我已经取得了相当大的成功。我不知道如何将 Pandas DataFrames 上传到我公司的 Netezza 以用于以后的查询。这实际上非常重要,因为我们有许多数据集可以上传并用于查询。
我有以下熊猫数据帧:
[In ] df
[Out]
col1 col2 col3
0 1 2 3
1 4 5 6
2 7 8 9
Run Code Online (Sandbox Code Playgroud)
我想通过 ODBC 连接将此 DataFrame 上传到我的 Netezza 盒子。连接已经建立如下:
import pyodbc
conn = pyodbc.connect("Driver=NetezzaSQL;Server=...;")
Run Code Online (Sandbox Code Playgroud)
我已将此连接与 Pandas 结合使用read_sql来提取数据并将其存储在 DataFrame 中。但是,我还没有弄清楚如何提取数据。在 SAS 中,我会执行以下操作:
proc sql _method;
connect to netezza as net_dw
(auth domain info goes here...)
execute( create temporary table my_table
( col1 int,
col2 int,
col3 int ) distribute on (col1) by …Run Code Online (Sandbox Code Playgroud) 我目前正在编写一个脚本来使用Python运行多个SQL文件,在您提到替代方法之前有一些背景知识; 这是自动化脚本,Python是我在Windows 2008服务器上使用的唯一工具.我有一个适用于一组的脚本,但问题是当另一组有两个语句而不是一个由';'分隔时 这是我的代码:
import os
import pyodbc
print ("Connecting via ODBC")
conn = pyodbc.connect('DSN=dsn', autocommit=True)
print ("Connected!\n")
inputdir = 'C:\\path'
cursor = conn.cursor()
for script in os.listdir(inputdir):
with open(inputdir+'\\' + script,'r') as inserts:
sqlScript = inserts.readlines()
sql = (" ".join(sqlScript))
cursor.execute(sql)
print (script)
conn.close()
print ('Run Complete!')
Run Code Online (Sandbox Code Playgroud)
所以这段代码可以显示整个文件,但它只在";"之前执行一条语句.
任何帮助都会很棒!
谢谢.
我NVARCHAR在我的数据库中有类型列.我无法在我的代码中将此列的内容转换为纯字符串.(我pyodbc用于数据库连接).
# This unicode string is returned by the database
>>> my_string = u'\u4157\u4347\u6e65\u6574\u2d72\u3430\u3931\u3530\u3731\u3539\u3533\u3631\u3630\u3530\u3330\u322d\u3130\u3036\u3036\u3135\u3432\u3538\u2d37\u3134\u3039\u352d'
# prints something in chineese
>>> print my_string
??????????????????????????
Run Code Online (Sandbox Code Playgroud)
我离开的最近的是通过将其编码utf-16为:
>>> my_string.encode('utf-16')
'\xff\xfeWAGCenter-04190517953516060503-20160605124857-4190-5'
>>> print my_string.encode('utf-16')
??WAGCenter-04190517953516060503-20160605124857-4190-5
Run Code Online (Sandbox Code Playgroud)
但是,根据数据库中的值存储,我需要的实际值是:
WAGCenter-04190517953516060503-20160605124857-4190-51
Run Code Online (Sandbox Code Playgroud)
我试图用编码它utf-8,utf-16,ascii,utf-32但似乎没有任何工作.
有没有人知道我错过了什么?以及如何从中获得所需的结果my_string.
编辑:在转换为utf-16-le,我能够从开始删除不需要的字符,但仍然从一端丢失一个字符
>>> print t.encode('utf-16-le')
WAGCenter-04190517953516060503-20160605124857-4190-5
Run Code Online (Sandbox Code Playgroud)
在尝试其他一些列时,它正在工作.这个间歇性问题的原因可能是什么?