我正在将一些 PostgreSQL 查询迁移到 Snowflake,并且正在努力复制以下查询:
WITH test_table(col1, col2, col3, col4) AS (
VALUES
(1, 1, 7, 5),
(1, 1, 6, 4),
(1, 2, 1, 4),
(1, 2, 2, 5),
(1, 2, 3, 6)
)
SELECT
col1,
col2,
(max(ARRAY[col3, col4]))[2]
FROM test_table
GROUP BY 1, 2
Run Code Online (Sandbox Code Playgroud)
col4此查询设法获取与 的最大值相对应的值col3 grouped by col1, col2。然而,我没有找到任何优雅的解决方案来在 Snowflake 上复制这一点。
sql greatest-n-per-group maxby snowflake-cloud-data-platform
我见过一些这样的问题 - Count NULL Values from multiple columns with SQL
但是,真的没有办法计算超过 30 列的表中的空值吗?就像我不想按名称指定它们一样?
关于snowflake .NET连接器:https://github.com/snowflakedb/snowflake-connector-net,我在文档或源代码中找不到任何内容表明支持连接池,并且因为连接本身由HttpClient,我们知道HttpClient 应该重用而不是不断创建/处置,当您要跨线程进行许多查询时,使用雪花 .NET 连接器的最佳方法是什么?
注意:我不打算在创建连接后更改连接的任何属性(架构、数据库等)。
例如:
// application startup registers this provider as a singleton
public class SnowflakeConnectionProvider : IDisposable
{
private IDbConnection _conn;
public SnowflakeConnectionProvider()
{
_conn = new SnowflakeDbConnection();
_conn.ConnectionString = "connectionString";
_conn.Open();
}
public IDbConnection conn { get => _conn; }
public Dispose() => _conn.Close();
}
Run Code Online (Sandbox Code Playgroud)
现在,多个线程共享一个线程是否安全,SnowflakeDbConnection如下所示:
public class Worker
{
public Worker(SnowflakeConnectionProvider provider)
{
IDbConnection conn = provider.conn;
IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from …Run Code Online (Sandbox Code Playgroud) 如果我在雪花中创建一个表,然后使用 CREATE OR REPLACE 语句创建另一个同名的表,我将无法使用时间旅行访问第一个表的内容。
例如,如果我运行这段代码
CREATE TABLE "MY_DB"."MY_SCHEMA"."MY_TABLE" (COL1 VARCHAR, COL2 NUMBER);
INSERT INTO "MY_DB"."MY_SCHEMA"."MY_TABLE" VALUES ('A',1);
Run Code Online (Sandbox Code Playgroud)
...然后在五分钟内运行这段代码
CREATE OR REPLACE TABLE "MY_DB"."MY_SCHEMA"."MY_TABLE" (COL1 VARCHAR, COL2 NUMBER);
INSERT INTO "MY_DB"."MY_SCHEMA"."MY_TABLE" VALUES ('B',2);
SELECT * FROM "MY_DB"."MY_SCHEMA"."MY_TABLE"
UNION
SELECT * FROM "MY_DB"."MY_SCHEMA"."MY_TABLE" AT (offset => -60*1)
Run Code Online (Sandbox Code Playgroud)
该查询仅返回第二个表中的值。这种行为是预期的吗?我试图用谷歌搜索这个或在雪花文档中找到澄清,但没有任何运气......
谢谢
我正在尝试在 docker 容器内使用雪花连接器。我想使用externalbrowser身份验证器,以便可以使用 Okta 凭据进行连接,但连接器失败并出现下面提到的错误。
DatabaseError: (snowflake.connector.errors.DatabaseError) 250008 (08001): None: 无法连接到 DB: xx.snowflakecomputing.com:443,无法在此环境中打开浏览器。(此错误的背景位于:http ://sqlalche.me/e/13/4xp6 )
python-webbrowser docker snowflake-cloud-data-platform docker-network
Snowflake 没有记录其使用 AS 子句的虚拟列功能。我正在进行迁移,需要以编程方式过滤掉虚拟列。
有什么方法可以识别一列是虚拟的吗?该Information Schema.COLLUMNS视图显示虚拟列定义和非虚拟列定义之间没有任何区别。
calculated-columns virtual-column snowflake-cloud-data-platform
内部阶段的概念具有误导性,或者我的解释不正确。请纠正我的理解。根据文档
我在让 Snowflake 的 ODBC 驱动程序在运行 Big Sur 的 M1 Apple Silicon Mac 上运行时遇到问题。
成功遵循Snowflake 网站上的说明后,我使用 DSN 从命令行(使用 iodbctest)测试驱动程序,结果出现以下错误:
1: SQLDriverConnect = [iODBC][Driver Manager]dlopen(/opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib, 6): no suitable image found. Did find:
/opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib: no matching architecture in universal wrapper
/opt/snowfl (0) SQLSTATE=00000
2: SQLDriverConnect = [iODBC][Driver Manager]Specified driver could not be loaded (0) SQLSTATE=IM003
Run Code Online (Sandbox Code Playgroud)
我的 Snowflake 驱动程序安装到/opt/snowflake/snowflakeodbc,所以这是正确的 - 我怀疑这具体是一个 M1 问题。我使用的是 2.24.1 版本的驱动程序,可从此处的下载镜像获取,驱动程序的路径为/etc/odbcinst.ini(/opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib该路径存在,并且从我的所有研究看来,它应该是正确的)。
当我在 R 中通过 DBI 运行连接时,出现完全不同的错误:
Error: nanodbc/nanodbc.cpp:1021: 00000:
[Snowflake][ODBC] …Run Code Online (Sandbox Code Playgroud) 在我们的 Snowflake 数据仓库实例中,当使用 DDL 语句将数据从阶段加载到表中时,timestamp_ntz 列中的某些记录在 Snowflake UI 中COPY INTO显示值。Invalid date
timestamp_ntz 列中的这些Invalid date值具有以下特性:
WHERE strange_timestamp_col > current_timestamp()我们希望在尝试执行COPY INTODDL 语句时,无效的数据格式会返回错误;相反,这些具有奇怪属性的邪恶伪时间戳被插入。