我正在尝试确定给定ID的值是第一次出现(现在称为状态),还是以前曾保存过该值。如果是第一次状态等于1或2,我想返回1 = Y或0 = N。下面的结果是我想要重新创建的结果。任何帮助是极大的赞赏。谢谢
ID Date Status First Time
1 1/1/2017 1 Y
2 1/1/2017 0 N
3 1/1/2017 0 N
4 1/1/2017 2 Y
5 1/1/2017 0 N
1 2/1/2017 0 N
2 2/1/2017 0 N
3 2/1/2017 1 Y
4 2/1/2017 0 N
5 2/1/2017 1 Y
1 3/1/2017 2 N
2 3/1/2017 0 N
3 3/1/2017 0 N
4 3/1/2017 1 N
5 3/1/2017 1 N
答案 0 :(得分:1)
SELECT t1.ID, t1.Date, t1.status
, CASE WHEN firsts.ID IS NULL 'N' ELSE 'Y' END AS `First Time`
FROM theTable AS t1
LEFT JOIN
(SELECT ID, MIN(Date) AS fDate
FROM theTable AS t0
WHERE status IN (1, 2)
GROUP BY ID
) AS firsts
ON t1.ID = firsts.ID AND t1.status IN (1, 2) AND t1.Date = firsts.fDate
;
您可以使用子查询来确定第一个查询,然后加入原始记录以“添加”该信息。
注意:如果ID的前1和2状态值在同一天出现,则这可能会导致一些冗余的第一;但是当前对“第一”的定义并没有真正说明哪个状态将是“第一”。
答案 1 :(得分:0)
类似的事情可能对您有用。按日期排序并按状态划分的ROW_NUMBER函数将添加一个计数器,该计数器在每组相似的状态内将根据升序从1开始递增。
将其与CASE语句结合使用时,可以说状态为“第一次”,即该计数器为1或2。
EventHubs consumer group
编辑: 如下所述,这是一个SQL Sever解决方案。您将进行一些调整以在MYSQL中获得它。
答案 2 :(得分:0)
只需检查状态是否为1或2,以及是否存在具有相同ID且早于日期为状态1或2的记录。
select ID, Date, Status,
case
when a.Status in (1,2) and not exists(select * from table b where a.ID = b.ID and b.Status in (1,2) and b.Date < a.Date) then 'Y'
else 'N'
end as First
from table a
答案 3 :(得分:0)
有效的解决方案,如果我正确理解了问题:
测试表创建:
WITH Test (ID, [Date], [Status]) AS (
SELECT * FROM (
VALUES
(1,Convert(datetime, '1/1/2017', 120),1),
(2,Convert(datetime, '1/1/2017', 120),0),
(3,Convert(datetime, '1/1/2017', 120),0),
(4,Convert(datetime, '1/1/2017', 120),2),
(5,Convert(datetime, '1/1/2017', 120),0),
(1,Convert(datetime, '2/1/2017', 120),0),
(2,Convert(datetime, '2/1/2017', 120),0),
(3,Convert(datetime, '2/1/2017', 120),1),
(4,Convert(datetime, '2/1/2017', 120),0),
(5,Convert(datetime, '2/1/2017', 120),1),
(1,Convert(datetime, '3/1/2017', 120),2),
(2,Convert(datetime, '3/1/2017', 120),0),
(3,Convert(datetime, '3/1/2017', 120),0),
(4,Convert(datetime, '3/1/2017', 120),1),
(5,Convert(datetime, '3/1/2017', 120),1)
) AS A (Column1, Column2, Column3)
)
查询:
SELECT id,
[Date],
(SELECT [Status] FROM Test b
WHERE a.ID = b.ID
AND a.[Date] = b.[Date]) AS [Status],
CASE WHEN (SELECT MIN([Date])
FROM Test
WHERE [Status] IN (1, 2)
AND ID = a.ID
GROUP BY ID
) = a.[Date] THEN 'Y'
ELSE 'N'
END AS FirstTime
FROM Test a
GROUP BY ID, [Date]