我有带以下数据的表test_member。
meme_ck mepe_eff_dt mepe_term_dt
1 6/1/2010 12:00:00 AM 12/31/9999 12:00:00 AM
1 5/1/2010 12:00:00 AM 6/1/2010 12:00:00 AM
1 3/1/2010 12:00:00 AM 4/1/2010 12:00:00 AM
1 5/1/2010 12:00:00 AM 6/1/2010 12:00:00 AM
1 2/1/2010 12:00:00 AM 3/1/2010 12:00:00 AM
1 1/1/2010 12:00:00 AM 2/1/2010 12:00:00 AM
2 2/10/2010 12:00:00 AM 3/10/2010 12:00:00 AM
2 1/10/2010 12:00:00 AM 2/10/2010 12:00:00 AM
2 6/10/2010 12:00:00 AM 12/31/9999 12:00:00 AM
2 5/10/2010 12:00:00 AM 6/10/2010 12:00:00 AM
2 3/10/2010 12:00:00 AM 4/10/2010 12:00:00 AM
3 1/1/2011 12:00:00 AM 12/31/9999 12:00:00 AM
3 10/1/2010 12:00:00 AM 11/1/2010 12:00:00 AM
3 11/1/2010 12:00:00 AM 12/1/2010 12:00:00 AM.
对于每个meme_ck
,mepe_term_dt
将是下一个meme_ck
mepe_eff_dt
,但是meme_ck
中只有很少的mepe_eff_dt
没有较早的mepe_term_dt
,我需要使用sql query找出那些记录,专业知识请帮忙! !!!!
答案 0 :(得分:0)
编辑:
在评论中澄清了,OP正在寻找起始日期前有间隔而不是后有间隔的记录。仍然可以通过反联接来实现,只需在JOIN
上进行另一种操作即可。
SELECT t1.meme_ck, t1.mepe_eff_dt, t1.mepe_term_dt
FROM t1
LEFT OUTER JOIN t1 t2 ON t1.meme_ck = t2.meme_ck
AND t1.mepe_eff_dt = t2.mepe_term_dt
WHERE t2.meme_ck IS NULL
ORDER BY t1.meme_ck, t1.mepe_eff_dt, t1.mepe_term_dt
这还包括meme_ck
的第一条记录,因为根据定义,它们的开始日期之前没有结束日期。如果最后的日期之间有间隔,这还将包括最后的日期。
https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=24166fd317b911b27a8582c099126972
演示使用字符串中的日期值与实际使用日期对象之间的区别。由于有数据,将返回有效的行,但是您可以看到以这种格式的字符串“ date”可能以不同的顺序排序。当处理应该代表日期的内容时,我总是发现 MUCH 更好地处理实际日期。 (注意:当我将它们设置为SQL日期类型时,我也更改了日期格式,因为dbfiddle.uk使用DD-MM-YYYY而不是美国常见的MM-DD-YYYY样式。因此,您再次可以看到SQL如何表示不同于字符串的日期。另外请注意,作为实际日期,它将空字符串转换为1900-01-01的纪元日期。)
================================================ ========
原始: 使用反联接可以解决此问题,该联接应注意“日期”是实际日期数据类型还是它们是varchars。
SELECT t1.meme_ck, t1.mepe_eff_dt, t1.mepe_term_dt
FROM t1
LEFT JOIN t1 t2 ON t1.meme_ck = t2.meme_ck
AND t1.mepe_term_dt = t2.mepe_eff_dt
WHERE t2.meme_ck IS NULL
AND t1.mepe_term_dt <> '12/31/9999 12:00:00 AM'
/* Or whatever your ending date is. */
ORDER BY t1.meme_ck, t1.mepe_eff_dt, t1.mepe_term_dt
ORDER BY
并不是必须的。我只是出于说明目的将其包括在内。
meme_ck | mepe_eff_dt | mepe_term_dt
------: | :-------------------- | :--------------------
1 | 3/1/2010 12:00:00 AM | 4/1/2010 12:00:00 AM
2 | 3/10/2010 12:00:00 AM | 4/10/2010 12:00:00 AM
3 | 11/1/2010 12:00:00 AM | 12/1/2010 12:00:00 AM
https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=9b27da9988bc60a56ae86c9f093d3346