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;