我试图抓取指定的所有行RowID
,其中EffectiveDate
与此不同。 但是,如果我们有多行使用相同的EffectiveDate
,我想抓取所有其他行,并使用InsertDateTime
列插入的最后一条记录的日期相同。如果effectivedate与其他行相同,则获取最新记录
这里是样本数据:在这个例子中
所以,我在找的输出是这样的:
我们跳过与ID的行2 & & 3因为它们的InsertDateTime
小于第4行的InsertDateTime
。
我采取的方法是做一个datediff
EffectiveDate
之间,如果second
是0
比他们是相同的值,我应该抓住最后一个记录。但是,使用这种方法,由于我的join
,它不会返回我的最后一条记录。
我想我很复杂这个查询。
CREATE TABLE #MyTable
(
ID int identity(1,1),
RowID char(10),
EffectiveDate DateTime,
InsertDateTime DateTime
)
INSERT INTO #MyTable(RowID, EffectiveDate, InsertDatetime) VALUES
('55555', '2017-06-01 00:00:00.000','2017-06-01 13:19:01.000')
INSERT INTO #MyTable(RowID, EffectiveDate, InsertDatetime) VALUES
('55555', '2017-07-01 00:00:00.000','2017-06-01 13:34:01.000')
INSERT INTO #MyTable(RowID, EffectiveDate, InsertDatetime) VALUES
('55555', '2017-07-01 00:00:00.000','2017-06-01 13:54:01.000')
INSERT INTO #MyTable(RowID, EffectiveDate, InsertDatetime) VALUES
('55555', '2017-07-01 00:00:00.000','2017-06-01 13:56:01.000')
--The correct output it should return
--SELECT * FROM #MyTAble WHERE ID IN (1,4) order by 4
;WITH CTE AS
(
SELECT ID, RowID, EffectiveDate, InsertDateTime,
ROW_Number() OVER (Order by InsertDateTime) AS rn
FROM #MyTable
),
CTE2 AS
(
SELECT datediff(second, mc.EffectiveDate, mp.EffectiveDate) as Sec, mc.*,
mp.EffectiveDate as Date2 FROM CTE mc
JOIN CTE mp
ON mc.rn = mp.rn - 1
)
SELECT *, CASE WHEN SEC = 0 THEN 1
ELSE 0 END AS Valid
FROM CTE2
我如何能解决这个问题有什么建议?
将在最后一个ID永远是最新的IsertDateTime?如果是这样,你可以在查询中使用UNIQUE和ORDER BY吗? – cbarg