[英]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.