- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将此 pl/pgSQL 函数转换为在 Snowflake 上工作。不幸的是,我刚开始使用 Snowflake,无法正确转换它。 Snowflake 计划在年底前支持 pgSQL 查询,不幸的是,目前还没有。
这里是一个快速介绍,让您了解我的表存储什么以及该功能的作用。我有三张 table 。您可以在这个问题的底部找到所有表和示例数据的 DDL 语句。
我每天一次将数据导入事件表。我们感兴趣的事件是设备类型为 1 和 2(进入/退出)的事件。然后我运行我的函数,它计算具有相同 card_nr 的事件之间的正确持续时间。之后,我将这些持续时间导入我的持续时间表并更新属性表。
这是事件的一个例子:
下面是调用函数后的持续时间示例:
我需要涵盖的最重要的事情是:
durationLimitDate = (Max(event_time) - durationLimitDays))
函数
CREATE OR REPLACE FUNCTION calculateduration() RETURNS void AS $function$
WITH cte AS (SELECT e.id, e.card_nr, e.event_time, e.ticket_type, e.manufacturer, e.carpark_id, e.device_type,
ROW_NUMBER() OVER (ORDER BY e.card_nr, e.carpark_id, e.event_time, e.device_type) AS rn
FROM events e
LEFT JOIN durations d ON d.event_id_arrival = e.id OR d.event_id_departure = e.id
WHERE e.event_time >= (SELECT PROP_VALUE::timestamp FROM properties WHERE prop_key = 'DURATION.LIMIT.DATE')
AND e.device_type IN (1, 2)
AND event_type = 2
AND e.manufacturer LIKE 'XX%'
AND d.id IS NULL)
INSERT INTO durations (id, odb_created_at, event_id_arrival, event_id_departure,
event_time_arrival, event_time_departure,
card_nr, ticket_type, duration, manufacturer, carpark_id)
SELECT nextval('durations_id_seq'),
current_timestamp,
arrived_entry.id,
departed_entry.id,
arrived_entry.event_time,
departed_entry.event_time,
arrived_entry.card_nr,
arrived_entry.ticket_type,
date_part('epoch', departed_entry.event_time::timestamp - arrived_entry.event_time::timestamp),
arrived_entry.manufacturer,
arrived_entry.carpark_id
FROM (SELECT * FROM cte WHERE cte.device_type = 1) AS arrived_entry
INNER JOIN (SELECT * FROM cte WHERE cte.device_type = 2) AS departed_entry ON arrived_entry.card_nr = departed_entry.card_nr
AND arrived_entry.carpark_id = departed_entry.carpark_id
AND arrived_entry.rn + 1 = departed_entry.rn;
UPDATE properties
SET PROP_VALUE = (SELECT (MAX(event_time) - ((SELECT PROP_VALUE FROM properties WHERE prop_key = 'DURATION.LIMIT.DAYS') ||' day')::interval) FROM events WHERE event_time >= (SELECT PROP_VALUE::timestamp FROM properties WHERE prop_key = 'DURATION.LIMIT.DATE'))
WHERE PROP_KEY ='DURATION.LIMIT.DATE';
$function$
LANGUAGE sql;
DDL 脚本
-- events
CREATE TABLE IF NOT EXISTS events (
id bigint NOT NULL autoincrement start 1 increment 1 PRIMARY KEY,
odb_created_at timestamp without time zone NOT NULL,
event_time timestamp without time zone NOT NULL,
device_type integer NOT NULL,
event_type integer NOT NULL,
ticket_type integer NOT NULL,
card_nr character varying(100),
count integer DEFAULT 1 NOT NULL,
manufacturer character varying(200),
carpark_id bigint
);
-- durations
CREATE TABLE IF NOT EXISTS durations (
id bigint NOT NULL autoincrement start 1 increment 1 PRIMARY KEY,
odb_created_at timestamp without time zone NOT NULL,
event_id_arrival bigint,
event_id_departure bigint,
event_time_arrival timestamp without time zone,
event_time_departure timestamp without time zone,
card_nr character varying(100),
ticket_type integer,
duration integer,
manufacturer character varying(200),
carpark_id bigint
);
--properties
create or replace TABLE PROPERTIES (
PROP_KEY VARCHAR(80) NOT NULL,
PROP_VALUE VARCHAR(250),
primary key (PROP_KEY)
);
示例数据:
INSERT INTO properties (prop_key,prop_value) VALUES
('DURATION.LIMIT.DAYS','30'),
('DURATION.LIMIT.DATE','2021-08-01 00:00:00.00');
INSERT INTO public.events (id, odb_created_at, event_time, device_type, event_type, ticket_type, card_nr, count, manufacturer, carpark_id) VALUES(188160996, '2021-10-02 04:28:26.338', '2021-10-01 09:14:41.32', 1, 2, 11, '03998988030897300007782', 1, 'XX', 1852);
INSERT INTO public.events (id, odb_created_at, event_time, device_type, event_type, ticket_type, card_nr, count, manufacturer, carpark_id) VALUES(188160790, '2021-10-02 04:28:26.248', '2021-10-01 09:31:10.94', 2, 2, 11, '03998988030897300007782', 1, 'XX', 1852);
INSERT INTO public.events (id, odb_created_at, event_time, device_type, event_type, ticket_type, card_nr, count, manufacturer, carpark_id) VALUES(188146489, '2021-10-02 04:26:55.069', '2021-10-01 10:03:01.57', 1, 2, 500, '01479804030429500089598', 1, 'XX', 1563);
INSERT INTO public.events (id, odb_created_at, event_time, device_type, event_type, ticket_type, card_nr, count, manufacturer, carpark_id) VALUES(188146069, '2021-10-02 04:26:54.852', '2021-10-01 11:49:58.45', 2, 2, 500, '01479804030429500089598', 1, 'XX', 1563);
INSERT INTO public.events (id, odb_created_at, event_time, device_type, event_type, ticket_type, card_nr, count, manufacturer, carpark_id) VALUES(188161161, '2021-10-02 04:28:26.372', '2021-10-01 18:44:33.62', 1, 2, 11, '03998988030897300007782', 1, 'XX', 1852);
INSERT INTO public.events (id, odb_created_at, event_time, device_type, event_type, ticket_type, card_nr, count, manufacturer, carpark_id) VALUES(188160950, '2021-10-02 04:28:26.329', '2021-10-01 18:45:51.903', 2, 2, 11, '03998988030897300007782', 1, 'XX', 1852);
INSERT INTO public.events (id, odb_created_at, event_time, device_type, event_type, ticket_type, card_nr, count, manufacturer, carpark_id) VALUES(188161227, '2021-10-02 04:28:26.374', '2021-10-01 23:21:18.58', 1, 2, 11, '04139733030897300003136', 1, 'XX', 1852);
INSERT INTO public.events (id, odb_created_at, event_time, device_type, event_type, ticket_type, card_nr, count, manufacturer, carpark_id) VALUES(188160974, '2021-10-02 04:28:26.334', '2021-10-01 23:24:03.29', 2, 2, 11, '04139733030897300003136', 1, 'XX', 1852);
INSERT INTO public.events (id, odb_created_at, event_time, device_type, event_type, ticket_type, card_nr, count, manufacturer, carpark_id) VALUES(188239864, '2021-10-03 04:24:43.345', '2021-10-02 06:49:55.97', 1, 2, 11, '01719400030897300061410', 1, 'XX', 1852);
INSERT INTO public.events (id, odb_created_at, event_time, device_type, event_type, ticket_type, card_nr, count, manufacturer, carpark_id) VALUES(188239649, '2021-10-03 04:24:43.308', '2021-10-02 07:02:08.72', 2, 2, 11, '01719400030897300061410', 1, 'XX', 1852);
谢谢!
独特的测试
CREATE TABLE IF NOT EXISTS test (
id bigint NOT NULL AUTOINCREMENT PRIMARY KEY -- Check the syntax!
, odb_created_at timestamp without time zone NOT NULL
, event_time timestamp without time zone NOT NULL
, device_type integer NOT NULL
, event_type integer NOT NULL
, ticket_type integer NOT NULL
, card_nr character varying(100)
, count integer DEFAULT 1 NOT NULL
, manufacturer character varying(200)
, carpark_id bigint
, UNIQUE (card_nr, event_time) -- NATURAL KEY
);
INSERT INTO EUILOGS_DEV.ILOGS.TEST (ODB_CREATED_AT, EVENT_TIME, DEVICE_TYPE, EVENT_TYPE, TICKET_TYPE, CARD_NR, COUNT, MANUFACTURER, CARPARK_ID)
VALUES(current_timestamp(), '2021-01-01 15:00:00.000', 1, 1, 1, 'CARD1', 1, 'MAN1', 1);
INSERT INTO EUILOGS_DEV.ILOGS.TEST (ODB_CREATED_AT, EVENT_TIME, DEVICE_TYPE, EVENT_TYPE, TICKET_TYPE, CARD_NR, COUNT, MANUFACTURER, CARPARK_ID)
VALUES(current_timestamp(), '2021-01-01 15:00:00.000', 1, 1, 1, 'CARD1', 1, 'MAN1', 1);
最佳答案
您需要使用序列来生成自动编号: https://docs.snowflake.com/en/user-guide/querying-sequences.html
所以先创建一个sequence来使用它:
create or replace sequence seq1;
然后使用下面的函数:
create or replace procedure calculateduration()
RETURNS string
LANGUAGE JAVASCRIPT
AS $$
var query1 =
`
INSERT INTO durations (id, odb_created_at, event_id_arrival, event_id_departure,
event_time_arrival, event_time_departure,
card_nr, ticket_type, duration, manufacturer, carpark_id)
WITH cte AS (
SELECT e.id, e.card_nr, e.event_time, e.ticket_type, e.manufacturer, e.carpark_id, e.device_type,
ROW_NUMBER() OVER (ORDER BY e.card_nr, e.carpark_id, e.event_time, e.device_type) AS rn
FROM events e
LEFT JOIN durations d ON d.event_id_arrival = e.id OR d.event_id_departure = e.id
WHERE e.event_time >= (SELECT PROP_VALUE::timestamp FROM properties WHERE prop_key = 'DURATION.LIMIT.DATE')
AND e.device_type IN (1, 2)
AND event_type = 2
AND e.manufacturer LIKE 'XX%'
AND d.id IS NULL
)
SELECT
seq1.nextval,
current_timestamp(),
arrived_entry.id,
departed_entry.id,
arrived_entry.event_time,
departed_entry.event_time,
arrived_entry.card_nr,
arrived_entry.ticket_type,
timestampdiff(second, arrived_entry.event_time, departed_entry.event_time),
arrived_entry.manufacturer,
arrived_entry.carpark_id
FROM (SELECT * FROM cte WHERE cte.device_type = 1) AS arrived_entry
INNER JOIN (SELECT * FROM cte WHERE cte.device_type = 2) AS departed_entry
ON arrived_entry.card_nr = departed_entry.card_nr
AND arrived_entry.carpark_id = departed_entry.carpark_id
AND arrived_entry.rn + 1 = departed_entry.rn
`;
snowflake.execute({ sqlText: query1 });
var query2 = "SELECT PROP_VALUE FROM properties WHERE prop_key = 'DURATION.LIMIT.DAYS'";
var stmt = snowflake.createStatement({ sqlText: query2 });
var resultSet = stmt.execute();
resultSet.next();
var prop_value = resultSet.getColumnValue(1);
var query3 =
`
UPDATE properties
SET PROP_VALUE = (
SELECT dateadd(day, -1 * ${prop_value}, MAX(event_time)) FROM events
WHERE event_time >= (
SELECT PROP_VALUE::timestamp FROM properties WHERE prop_key = 'DURATION.LIMIT.DATE'
)
)
WHERE PROP_KEY ='DURATION.LIMIT.DATE';
`
stmt = snowflake.createStatement({ sqlText: query3 });
stmt.execute();
return 'true';
$$;
然后调用过程:
call calculateduration();
代码很简单,没有太多验证和检查,但它应该可以完成您需要的工作。
关于postgresql - 将 Postgres 查询翻译为与 Snowflake 兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69660453/
像 MySQL 和 SQL Server 一样使用 Snowflake 创建参数化。需要从 .NET Snowflake .NET Connector 传递值。 https://www.mssqlti
在 snowflake/sql 查询中是否有任何方法可以查看哪些表被查询最多以及哪些列?我想知道哪些数据对我的用户最有值(value),但不确定如何以编程方式执行此操作。任何想法表示赞赏 - 谢谢!
目前我们的项目正在使用 Snowflake DWH。表中定义的列没有任何大小规范。不知道为什么这样做,因为很久以前就这样做了。如果未指定大小时,Snowflake DWH 是否会影响性能。例如,默认情
我在 SAP HANA 中为四分之一函数编写了“选择”查询。 select QUARTER (CURRENT_DATE, 8) FROM DUMMY; output: 2021-Q3 有人可以帮我解决
当我们创建数据库时会创建一个公共(public)模式,如果我们不指定任何模式,则会在公共(public)模式下创建表。如果您在从数据库中删除公共(public)模式时看到或遇到任何问题,能否告诉我,因
我有大约 2.2 GB 数据的大表。当我使用 SELECT * 选择表中的一行时,运行大约需要 14 分钟。有没有办法加快这个查询? 以下是一些可能有用的其他信息: ~ 200 万行 ~ 25k 列
我需要将表恢复到运行 CREATE OR REPLACE 语句之前的状态(即表仍然填充)。 我可以在历史记录中看到 QueryID,但我终生不记得我是如何还原更改的 最佳答案 解决方案已由 Franc
我正在寻找有关如何从现有表生成汇总表或 View 的一些 Snowflake 语法帮助。我的汇总表应该有来自现有表的每个唯一 ID 的 1 行以及指示是否已达到各种里程碑(根据汇总列名称)的 bool
我正在查看 WAREHOUSE_EVENTS_HISTORY,但找不到跟踪仓库大小调整值的方法。 如何从 Snowflake 中获取这些数据? (基于客户问题) 最佳答案 要跟踪调整大小的值,您可以在
我已经创建了单独的过程,当手动运行时使用 2 个日期参数运行。但是我正在尝试编写一个包装程序来顺序调用这些过程。到目前为止我所做的示例代码如下。 CREATE OR REPLACE PROCEDURE
在雪花文档中,我找不到使用索引的引用。 Snowflake 是否支持索引,如果不支持,使用 Snowflake 时性能调优的替代方法是什么? 最佳答案 Snowflake 不支持索引,但它支持“集群”
我们正在考虑将我们的 ODS 从 S3 转移到 Snowflake,但对性能有一些担忧。从 15 亿(这将在较小的一侧)行表中删除 3900 万行在超小型仓库上需要 15 分钟,小型仓库需要 8 分钟
(代表 Snowflake 用户提交) 在 Snowflake 上执行查询时,我需要它的查询 ID。所以我使用以下代码片段: cursor.execute(query, _no_results=Tru
当谈到集群大小时,文档指出,例如一个 XS 集群包含在 1 个服务器上。但是我一直在寻找服务器规范,但似乎找不到有关此主题的任何文档。 最佳答案 对于 AWS 雪花,如果您在 Chrome (F12)
我了解启用集群后,Snowflake 将运行后台任务来自动对您的记录进行集群。在某些情况下,我想重建整个表或使用 insert into select 语句填充新表。当我这样做时,我发现即使我预定义了
我是 SnowFlake 的新手。我在 Snowflake 中创建了一个表。以下是详细信息。 # Created @ 2020-01-07 21:11:20.810 -0800 CREATE TABL
我正在使用 Snowflake,我很惊讶它能够即时调整大小。这是一个非常10s video它如何立即调整大小,并且查询在下次运行时仍然是“热”的(注意我在查询中有一个CURRENT_TIMESTAMP
我需要一些关于雪花存储过程与用户定义函数的最佳用例的指导。请问是否有关于其中一个比另一个更合适的场景的指南?我正在努力为我的项目做出正确的选择。谢谢。 最佳答案 Snowflake 存储过程是用 Ja
我是 SnowFlake 的新手。我在 Snowflake 中创建了一个表。以下是详细信息。 # Created @ 2020-01-07 21:11:20.810 -0800 CREATE TABL
我正在使用 Snowflake,我很惊讶它能够即时调整大小。这是一个非常10s video它如何立即调整大小,并且查询在下次运行时仍然是“热”的(注意我在查询中有一个CURRENT_TIMESTAMP
我是一名优秀的程序员,十分优秀!