【发布时间】:2017-01-13 16:00:09
【问题描述】:
我构建的查询不适合解决方案。我尝试了很多查询,但无法得到我想要的结果。
我有下表
CREATE TABLE [dbo].[test](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ATC] [varchar](15) NOT NULL,
[PID] [varchar](7) NOT NULL,
[NAME] [varchar](50) NOT NULL,
[REG_DATE] [datetime] NULL,
[ACTIVE] [bit] NOT NULL CONSTRAINT [DF_test_ACTIVE] DEFAULT ((1))
) ON [PRIMARY]
示例数据
INSERT INTO [dbo].[test] ([ATC],[PID],[NAME],[REG_DATE],[ACTIVE])
VALUES ('A01','123456','TEST1','2016-08-31 00:00:00.000',0);
INSERT INTO [dbo].[test] ([ATC],[PID],[NAME],[REG_DATE],[ACTIVE])
VALUES ('A01','123456','TEST2','2016-09-01 00:00:00.000',0);
INSERT INTO [dbo].[test] ([ATC],[PID],[NAME],[REG_DATE],[ACTIVE])
VALUES ('A01','123456','TEST3','2016-09-02 00:00:00.000',0);
INSERT INTO [dbo].[test] ([ATC],[PID],[NAME],[REG_DATE],[ACTIVE])
VALUES ('A01','123456','TEST4','2016-09-03 00:00:00.000',0);
INSERT INTO [dbo].[test] ([ATC],[PID],[NAME],[REG_DATE],[ACTIVE])
VALUES('A01','123456','TEST5','2016-09-06 00:00:00.000',1);
示例查询:
;WITH CTE AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY ATC, PID ORDER BY REG_DATE ASC) AS ROWNUM,* FROM [dbo].[test]
WHERE ACTIVE=0
)
SELECT DATEDIFF(DAY, d2.REG_DATE, d1.REG_DATE),d1.NAME, d1.REG_DATE AS ACTIVE_REC_DATE, d2.REG_DATE AS NOTACTIVE_REC_DATE, d1.ACTIVE, d2.ACTIVE FROM [dbo].[test] as d1
LEFT JOIN CTE d2 ON d2.ATC = d1.ATC AND d2.PID = d1.PID
AND DATEDIFF(DAY, d2.REG_DATE, d1.REG_DATE) <= 7
WHERE d1.ACTIVE=1 AND d1.PID=123456;
想要的结果:
列 ACTIVE True (1) 的记录应包含(如果记录存在)不活动的先前记录的 REG_DATE,最长 7 天。喜欢:
(No column name) NAME ACTIVE_REC_DATE NOTACTIVE_REC_DATE ACTIVE ACTIVE
3 TEST5 2016-09-06 00:00:00.000 2016-08-31 00:00:00.000 1 0
目前查询结果包含多条记录,因为更多的记录将落在 7 天的时间段内。我需要加入 1 条最长 7 天的记录。
我使用了 ROW_NUMBER() 和 over partition by,所以我可以使用和识别第一条记录,因为我将按升序排序。当没有可用的以前记录或以前的记录超过 7 天时,这不起作用 当没有要加入的记录被忽略时,可以使用 INNER JOIN 或 null 处的日期列
我希望我的解释清楚。
【问题讨论】:
-
能否请您也发布您的预期结果表
-
您能解释一下“当没有可用的以前记录或以前的记录超过 7 天时,这不起作用”? - 在这种情况下结果应该是什么?
-
@SandipPatel 预期的结果也在我的解释中。它低于通缉结果:
标签: sql-server