【发布时间】:2022-01-14 08:42:02
【问题描述】:
我已经设法拼凑出一个有效的 SQL 查询,它使用了表的联合和连接的组合,为我提供了我需要的中间结果。
SELECT n.study_id AS StudyId,
n.practice_id AS PracticeId,
n.FluVaxCode,
n.Date,
date(p.BaseStart / 1000, 'unixepoch') AS BaseStart,
date(p.BaseEnd / 1000, 'unixepoch') AS BaseEnd,
date(p.OutcomeStart / 1000, 'unixepoch') AS OutcomeStart,
date(p.OutcomeEnd / 1000, 'unixepoch') AS OutcomeEnd,
CASE WHEN Date BETWEEN BaseStart AND BaseEnd THEN 'Y' ELSE 'N' END AS BaseVax,
CASE WHEN Date BETWEEN OutcomeStart AND OutcomeEnd THEN 'Y' ELSE 'N' END AS OutcomeVax
FROM toypractice p INNER JOIN
(SELECT t.study_id, t.practice_id,
date(t.event_date / 1000, 'unixepoch') AS Date,
t.code_id AS FluVaxCode
FROM toytherapy t
WHERE t.code_id IN ('dher.', 'a6b1.', 'bk31.')
UNION
SELECT c.study_id, c.practice_id,
DATE(c.event_date / 1000, 'unixepoch') AS Date,
c.code_id AS FluVaxCode
FROM toyclinical c
WHERE c.code_id IN ('1383.', '229..', 'X77RW')
ORDER BY FluVaxCode DESC
) n
ON p.practice_id = n.practice_id;
我最终得到多个列,包括三个:
Date, BaseStart, BaseEnd
所有这些都是 YYYY-MM-DD 格式(我认为)。有没有办法,在查询期间,我可以在查询结束时添加一些代码,以便它将在输出中创建一个新列,这样如果 Date 介于 BaseStart 和 BaseEnd 之间,则新列中的值将是' Y',否则新列中的值将是'N'?在这种情况下,我使用 sqlite 进行开发/测试,但它最终必须在 mssqlserver 2019 中工作。谢谢。 J
【问题讨论】:
-
参见:CASE 表达式和派生列。
-
如果您显示您的初始尝试或初始查询,则调整解决方案以将您的逻辑合并到 SQL 中会更容易。通常,这可能是派生表或 CTE 术语的形式,但并不总是必要的。
-
您的新 SQL 留下了另一个问题。
n.Date与其他值一样是派生的。它们应该是直接可用/可比较的。可能还缺少其他东西。如果您可以将CREATE TABLE语句添加到问题中,那可能会有所帮助。 -
如果您让
event_date暴露于外部逻辑,您可以在转换之前比较原始值。有很多方法可以构建它。 -
您应该能够进行单行调整。我已将该建议添加到答案中。
标签: sql date conditional-statements