【发布时间】:2018-03-01 00:35:23
【问题描述】:
我需要在基于加入测试表的测试日期之后获得最低(最早)2 个日期。我尝试过运行 QUALIFY-ROW_NUMBER-PARTITION,在示例中这似乎很简单,但它对我的查询并不好。 QUALIFY 之前的一切工作。我没有正确实施 QUALIFY,或者我应该只是使用另一种方法。
SELECT p.[ENTITY_ID]
,[PROD_DATE]
,[WTR]
,[WCNT]
,[DAYS]
,t.max_TEST_DATE
,wt.TEST_DATE
,wt.TEST_VOL
FROM (SELECT [ENTITY_ID]
,max([TEST_DATE]) as max_TEST_DATE
FROM [dbo].[PDEN_TEST]
group by ENTITY_ID) as t
INNER JOIN [dbo].[PDEN_WELL_TEST] wt
on t.max_TEST_DATE = wt.TEST_DATE and t.ENTITY_ID = wt.ENTITY_ID
inner join [dbo].[PDEN_PROD] p
on p.ENTITY_ID = t.ENTITY_ID
where PROD_DATE >= TEST_DATE
qualify
row_number() over (partition by p.ENTITY_ID, [PROD_DATE]) <=2
感谢 Gordon 修改如下,但我只获得了每个 Entity_ID 的第一次出现而不是 2
SELECT top (2) with ties p.[ENTITY_ID]
,[PROD_DATE]
,[WTR]
,[WCNT]
,[DAYS]
,t.max_TEST_DATE
,wt.TEST_DATE
,wt.TEST_VOL as IP24
FROM (SELECT [ENTITY_ID]
,max([TEST_DATE]) as max_TEST_DATE
FROM [DI].[dbo].[PDEN_WELL_TEST]
group by ENTITY_ID) as t
INNER JOIN [DI].[dbo].[PDEN_WELL_TEST] wt
on t.max_TEST_DATE = wt.TEST_DATE and t.ENTITY_ID = wt.ENTITY_ID
inner join [DI].[dbo].[PDEN_PROD] p
on p.ENTITY_ID = t.ENTITY_ID
where PROD_DATE >= TEST_DATE
ORDER BY row_number() OVER (partition BY p.ENTITY_ID ORDER BY PROD_DATE)
ENTITY_ID PROD_DATE WTR WCNT DAYS max_TEST_DATE TEST_DATE IP24 60916 1998-12-01 1395 1 31 1998-11-21 1998-11-21 160 60919 1997-11-01 242 1 30 1997-10-10 1997-10-10 9776 60920 1993-04-01 50710 1 30 1993-04-01 1993-04-01 173 60921 1994-07-01 8300 1 14 1994-06-26 1994-06-26 0 60928 2017-04-01 38733 1 30 2017-03-14 2017-03-14 232 60926 2017-06-01 20379 1 20 2017-05-08 2017-05-08 29 60929 2001-07-01 8288 1 31 2001-06-09 2001-06-09 68
【问题讨论】:
-
请提供一些示例数据和预期结果
-
我将数据库标签更改为“teradata”。 SQL Server 不支持限定(据我所知)。
-
正如 Gordon 所写,SQL Server 中没有 QUALIFY,您需要将 ROW_NUMBER 包装在 CTE 或 Dervied 表中并将条件移至外部 WHERE。
标签: sql sql-server partition row-number