[英]SQL, during query create new column based on data conditions
我已经设法拼凑出一个有效的 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 中工作。谢谢。 Ĵ
尝试将以下内容添加到您当前的 select 列表中:
, CASE WHEN n.Date BETWEEN date(p.BaseStart / 1000, 'unixepoch') AND date(p.BaseEnd / 1000, 'unixepoch') THEN 'a' ELSE 'b' END AS is_between
这可以通过不同的方式来完成。 但上述应该工作。
像这样的东西:
sqlite的具体测试用例,作为起点。
请注意,我尝试直接使用日期,这会产生错误的is_between
结果。 is_between2
显示正确的结果。
WITH cte (date, BaseStart, BaseEnd) AS (
SELECT 1467241200000, '2016-06-20', '2016-06-30' UNION
SELECT 1467241200000, '2017-06-20', '2017-06-30'
)
SELECT date(date / 1000, 'unixepoch'), BaseStart, BaseEnd
, CASE WHEN Date BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between
, CASE WHEN date(date / 1000, 'unixepoch') BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between2
FROM cte
;
and also:
WITH cte (date, BaseStart, BaseEnd) AS (
SELECT 1467241200000, '2016-06-20', '2016-06-30' UNION
SELECT 1467241200000, '2017-06-20', '2017-06-30'
)
, cte2 AS (
SELECT *
, date(date / 1000, 'unixepoch') AS conv_date
FROM cte
)
SELECT date(date / 1000, 'unixepoch'), BaseStart, BaseEnd
, CASE WHEN Date BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between
, CASE WHEN conv_date BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between2
FROM cte2
;
结果:
日期(日期/1000,'unixepoch') | 基础开始 | 基端 | 在。。。之间 | is_between2 |
---|---|---|---|---|
2016-06-29 | 2016-06-20 | 2016-06-30 | b | 一个 |
2016-06-29 | 2017-06-20 | 2017-06-30 | b | b |
一般回答:
SELECT Date, BaseStart, BaseEnd
, CASE WHEN Date BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between
FROM ( your SQL ) AS derived_table
;
or
WITH cte AS (
your sql
)
SELECT Date, BaseStart, BaseEnd
, CASE WHEN Date BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between
FROM cte
;
如果您选择的标识符与数据库支持的 SQL 语言中的保留或关键字冲突,则可能需要添加引号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.