簡體   English   中英

SQL:獲取具有最少日期的行+使用帶有select語句的CASE WHEN

[英]SQL: Fetch rows with least date + Use CASE WHEN with select statement

我有一個包含3列( idtypedate )的表,其中包含以下值:

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,選擇最小日期最少的行。 一旦完成,我想在我的輸出中另一個名為“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

如果您知道更好的方法,請告訴我。

如果您只接受列type 0/1值,則可以使用MAX()作為窗口函數。

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
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM