识别值是否在列中首次出现

时间:2018-08-24 17:32:56

标签: sql

我正在尝试确定给定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

4 个答案:

答案 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]