对于我们的代码之一,雪花中的左联接行为不正确。如果您可以找到相同的解决方案,请寻求帮助。
我们有一个基本数据表连接的样本数据设置,如下所述。
CREATE TABLE patient_test(pid INT);
INSERT INTO patient_test (pid) VALUES (100);
CREATE TABLE pateint_entry_test (pid INT,DateAdded DATETIME);
INSERT INTO pateint_entry_test (pid, DateAdded) VALUES (100, '2020-07-13');
现在看下面的代码,在这里我只是为您提供我们与其他查询集一起使用的示例子查询。我们的动机是根据给定的开始/结束日期为每个患者输入日期。
WITh patient_cte AS(
SELECT * FROM patient_test
)
,
dates AS(
SELECT DATEDIFF(day, CONVERT_TIMEZONE('EST', 'UTC', CAST(TO_TIMESTAMP('2020-07-06') AS TIMESTAMP_NTZ)),
CONVERT_TIMEZONE('EST', 'UTC', CAST(TO_TIMESTAMP('2020-07-12') AS TIMESTAMP_NTZ))) AS Total_Days,
CONVERT_TIMEZONE('EST', 'UTC', CAST(TO_TIMESTAMP('2020-07-06') AS TIMESTAMP_NTZ)) AS Start_Date,
CONVERT_TIMEZONE('EST', 'UTC', CAST(TO_TIMESTAMP('2020-07-12') AS TIMESTAMP_NTZ)) AS end_date
)
,
cte2 (date) as (
SELECT TO_DATE(START_DATE) FROM dates
UNION ALL
SELECT TO_DATE(DATEADD(day, 1, date)) FROM cte2 WHERE date < (SELECT TOP 1 END_DATE FROM dates)
),
cte3 AS (
select * from patient_cte
cross join cte2
)
SELECT cte3.pid as p_pid,
pateint_entry_test.pid as p_entry_pid,
pateint_entry_test.DateAdded,
cte3."DATE" ,
IFNULL( pateint_entry_test.DateAdded, cte3."DATE") AS CALCULATEDDATEMEASURED
FROM cte3
LEFT JOIN pateint_entry_test ON
cte3.pid = pateint_entry_test.pid AND
cte3."DATE" = TO_DATE(pateint_entry_test.DateAdded)
在这里您可以看到CALCULATEDDATEMEASURED
,第2到7行是2020-07-06 00:00:00
。但是由于DAETADDED
会为空,因此应该根据DATE
列值(根据此条件IFNULL( pateint_entry_test.DateAdded, cte3."DATE")
)来确定正确的日期
不确定什么是错误的,但其行为不符合预期。感谢您对此的帮助。谢谢。
答案 0 :(得分:0)
我不确定这是否是错误,但这是由于基于您编写查询的方式而强制输入的。这是在查询中使用的IFNULL语句中的TO_DATE逻辑与联接中的查询相同(并带有COALESCE以显示它产生的结果与IFNULL相同):
WITh patient_cte AS(
SELECT * FROM patient_test
)
,
dates AS(
SELECT DATEDIFF(day, CONVERT_TIMEZONE('EST', 'UTC', CAST(TO_TIMESTAMP('2020-07-06') AS TIMESTAMP_NTZ)),
CONVERT_TIMEZONE('EST', 'UTC', CAST(TO_TIMESTAMP('2020-07-12') AS TIMESTAMP_NTZ))) AS Total_Days,
CONVERT_TIMEZONE('EST', 'UTC', CAST(TO_TIMESTAMP('2020-07-06') AS TIMESTAMP_NTZ)) AS Start_Date,
CONVERT_TIMEZONE('EST', 'UTC', CAST(TO_TIMESTAMP('2020-07-12') AS TIMESTAMP_NTZ)) AS end_date
)
,
cte2 (date) as (
SELECT TO_DATE(START_DATE) FROM dates
UNION ALL
SELECT TO_DATE(DATEADD(day, 1, date)) FROM cte2 WHERE date < (SELECT TOP 1 END_DATE FROM dates)
),
cte3 AS (
select * from patient_cte
cross join cte2
)
SELECT cte3.pid as p_pid,
pateint_entry_test.pid as p_entry_pid,
pateint_entry_test.DateAdded,
cte3."DATE",
IFNULL( pateint_entry_test.DateAdded, cte3."DATE") AS ORIGINAL_ERROR,
IFNULL( to_date(pateint_entry_test.DateAdded), cte3."DATE") AS CALCULATEDDATEMEASURED,
coalesce(to_date(pateint_entry_test.DateAdded), cte3."DATE") as from_coalesce
FROM cte3
LEFT JOIN pateint_entry_test
ON cte3.pid = pateint_entry_test.pid
AND cte3."DATE" = to_date(pateint_entry_test.DateAdded);