SQL:获取日期最少的行 + 在 select 语句中使用 CASE WHEN
SQL: Fetch rows with least date + Use CASE WHEN with select statement
我有一个包含 3 列的 table (id, type, date) 具有以下值:
id type date
--- --- ---
191 0 2016-09-15 11:26:51.000
191 1 2016-09-15 11:30:31.000
200 0 2016-09-15 17:36:19.000
200 1 2016-09-15 18:26:51.000
331 0 2016-09-16 07:26:22.000
这就是我想要做的:
对于上面的每个 ticketid,select 最小日期最小的行。完成后,我希望我的输出中有另一列名为 "isEngaged",如果 ticketid 的任何记录都存在 type = 1,则该列将设置为 1。
我想要的输出:
id type date isEngaged
--- --- --- ---
191 0 2016-09-15 11:26:51.000 1
200 0 2016-09-15 17:36:19.000 1
331 0 2016-09-16 07:26:22.000 0
这是我目前所拥有的:(这只负责返回日期最少的行)
SELECT id, type, date FROM (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY date ASC) AS [Row], id, type, date)
FROM mytable WHERE type IN (0)) WHERE [Row] = 1
真的不确定如何合并 isEngaged 部分。我尝试使用 CASE WHEN 但不确定如何继续:
SELECT id, type, date,
"isEngaged" = CASE WHEN (SELECT * FROM mytable where type in (1) and id = <not sure what to put here>) THEN 1 ELSE 0 END
FROM mytable
如果您知道更好的方法,请告诉我。
select
id,
case when sum_engaged > 0 then 1 else 0 end as isEngaged,
min_date
from
(SELECT id,
sum(case when type IN( 1,3) then 1 else 0 end) as sum_engaged, min(date) as min_date
FROM mytable
group by id) g
如果您只接受 type
列中的 0/1
值,那么您可以将 MAX()
用作 window 函数。
SELECT
id, type, date, isEngaged
FROM (
SELECT
id, type, date,
MAX(type) OVER (PARTITION BY id) AS isEngaged
ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) AS rn
FROM mytable
) t
WHERE rn = 1
如果您接受大于 1 的值,那么 MAX()
中适当的 CASE
语句就足够了:
SELECT
id, type, date, isEngaged
FROM (
SELECT
id, type, date,
MAX(CASE WHEN type = 1 THEN 1 ELSE 0 END) OVER (PARTITION BY id) AS isEngaged
ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) AS rn
FROM mytable
) t
WHERE rn = 1
我有一个包含 3 列的 table (id, type, date) 具有以下值:
id type date
--- --- ---
191 0 2016-09-15 11:26:51.000
191 1 2016-09-15 11:30:31.000
200 0 2016-09-15 17:36:19.000
200 1 2016-09-15 18:26:51.000
331 0 2016-09-16 07:26:22.000
这就是我想要做的:
对于上面的每个 ticketid,select 最小日期最小的行。完成后,我希望我的输出中有另一列名为 "isEngaged",如果 ticketid 的任何记录都存在 type = 1,则该列将设置为 1。
我想要的输出:
id type date isEngaged
--- --- --- ---
191 0 2016-09-15 11:26:51.000 1
200 0 2016-09-15 17:36:19.000 1
331 0 2016-09-16 07:26:22.000 0
这是我目前所拥有的:(这只负责返回日期最少的行)
SELECT id, type, date FROM (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY date ASC) AS [Row], id, type, date)
FROM mytable WHERE type IN (0)) WHERE [Row] = 1
真的不确定如何合并 isEngaged 部分。我尝试使用 CASE WHEN 但不确定如何继续:
SELECT id, type, date,
"isEngaged" = CASE WHEN (SELECT * FROM mytable where type in (1) and id = <not sure what to put here>) THEN 1 ELSE 0 END
FROM mytable
如果您知道更好的方法,请告诉我。
select
id,
case when sum_engaged > 0 then 1 else 0 end as isEngaged,
min_date
from
(SELECT id,
sum(case when type IN( 1,3) then 1 else 0 end) as sum_engaged, min(date) as min_date
FROM mytable
group by id) g
如果您只接受 type
列中的 0/1
值,那么您可以将 MAX()
用作 window 函数。
SELECT
id, type, date, isEngaged
FROM (
SELECT
id, type, date,
MAX(type) OVER (PARTITION BY id) AS isEngaged
ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) AS rn
FROM mytable
) t
WHERE rn = 1
如果您接受大于 1 的值,那么 MAX()
中适当的 CASE
语句就足够了:
SELECT
id, type, date, isEngaged
FROM (
SELECT
id, type, date,
MAX(CASE WHEN type = 1 THEN 1 ELSE 0 END) OVER (PARTITION BY id) AS isEngaged
ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) AS rn
FROM mytable
) t
WHERE rn = 1