Sql 获取某个列组合的第一个匹配项

Sql 获取某个列组合的第一个匹配项,sql,hive,Sql,Hive,如何仅在某些列上获得不同的行 我试过: +---------------+-------+-------+-------------------+ |ID_NOTIFICATION|CD_ETAT|TYP_MVT|DT_CAPT | +---------------+-------+-------+-------------------+ |3111341 |AT |C |2019-06-12 00:03:37| |3111341

如何仅在某些列上获得不同的行

我试过:

+---------------+-------+-------+-------------------+
|ID_NOTIFICATION|CD_ETAT|TYP_MVT|DT_CAPT            |
+---------------+-------+-------+-------------------+
|3111341        |AT     |C      |2019-06-12 00:03:37|
|3111341        |AN     |M      |2019-06-12 15:08:43|
|3111341        |AN     |M      |2019-06-12 15:10:11|
|3111341        |AN     |M      |2019-06-12 15:10:50|
|3111341        |AN     |M      |2019-06-12 15:11:34|
|3111341        |AN     |M      |2019-06-12 15:12:03|
|3111341        |AN     |M      |2019-06-12 15:14:04|
|3111341        |AN     |M      |2019-06-12 15:14:40|
|3111341        |AN     |M      |2019-06-12 15:15:22|
|3111341        |AN     |M      |2019-06-12 15:15:57|
|3111341        |AN     |M      |2019-06-12 15:25:28|
|3111341        |AN     |M      |2019-06-12 15:25:29|
|3111341        |AN     |M      |2019-06-12 15:27:50|
|3111341        |AN     |M      |2019-06-12 15:28:37|
|3111341        |AN     |M      |2019-06-12 15:32:22|
|3111341        |AN     |M      |2019-06-12 15:32:59|
|3111341        |EC     |M      |2019-06-12 15:33:04|
|3111341        |AN     |M      |2019-06-13 00:04:33|
|3111341        |TE     |M      |9999-01-01 00:00:00|
+---------------+-------+-------+-------------------+
但它只会返回:

select id_notification, cd_etat, min(dt_capt)
FROM lkr_send_notification
GROUP BY id_notification, cd_etat;
但我也希望结果包括:

+---------------+-------+-------------------+
|ID_NOTIFICATION|CD_ETAT|DT_CAPT            |
+---------------+-------+-------------------+
|3111341        |AN     |2019-06-12 15:08:43|
|3111341        |AT     |2019-06-12 00:03:37|
|3111341        |EC     |2019-06-12 15:33:04|
|3111341        |TE     |9999-01-01 00:00:00|
实际上,我需要得到CD上发生的每一个变化

我要求的是同样的东西,不过是火花。我现在愿意在SQL中执行此操作。

使用lag:


这将返回状态更改的每一行。

谢谢!只是一个问题:如何过滤ID_通知的结果?我想在查询结束时使用adding和sn.id_notification='3111341'进行测试,但它仍然返回source@AbderrahmenM . . . 您应该能够在外部查询或内部查询中添加WHERE子句。你只需要使用括号来确保条件的计算是正确的。哦,我忘记了括号。现在工作。谢谢
|3111341        |AN     |2019-06-13 00:04:33|
SELECT sn.*
FROM (SELECT sn.*,
             LAG(cd_etat) OVER (PARTITION BY id_notification ORDER BY dt_capt) as prev_cd_etat
      FROM lkr_send_notification sn
     ) sn
WHERE prev_cd_etat IS NULL OR prev_cd_etat <> cd_etat;