SQL RN在两个CTE中计数,但仍然无法获得所需的精确行

  • 本文关键字:RN 两个 CTE SQL sql sql-server
  • 更新时间 :
  • 英文 :


SQL Server。使用SSMS作为SQL编辑器。

我有一个查询得到的数据超过了我需要的数据。从本质上讲,我只需要显示结果,告诉我客户账户上第一次发送填充信息的日期。如果客户暂停发货并重新启动,则仅为第一次重新启动灌装日期。我一直在使用两个CROSS APPLY、一个CROSS APPLY和一个CTE等处理此查询。

我靠得很近,但只在第一排。第2行的最后一列应该是日期,第3行应该是NULL,因为在客户结束暂停日期后,我们没有发送任何内容。这是我目前掌握的代码。

这三张表分别是:

客户:

2020年1月12日
CUST_NO SERIES_NO ACCT_OPENED
W125 1001

您只需要一个CTE,但需要更多的列来实现您的结果

第一个解决方案使用子项而不是CTE,我认为它会比CTE更快,但我没有用第二个CTE来测试它,它可以去除所有不必要的行数比1 大的行数

SELECT c.[CUST_NO], c.[SERIES_NO]
, CONVERT(date,[ACCT_OPENED]),CONVERT(date,[PAUSE_START_DATE]), CONVERT(date,[PAUSE_END_DATE])
,CONVERT(date,(SELECT TOP 1 [FILL_DATE] FROM FILL_DATE_HX 
WHERE [CUST_NO] = c.[CUST_NO] AND [SERIES_NO] = c.[SERIES_NO] AND [FILL_DATE] > p.[PAUSE_END_DATE])) as RESTART_REPLACEMENT_DATE
FROM CUSTOMER c INNER JOIN PAUSE_HX p ON c.[CUST_NO] = p.[CUST_NO] AND  c.[SERIES_NO] =  p.[SERIES_NO]
GO
CUST_NO|SERIES_NO|(无列名(|(无类名(|(没有列名(|RESTART_REPLACEMENT_DATE:--------|--------|:---------------|:------------|:--------|:-----------------------W125|1001|2020-12-01|2021-01-07|2021-01-15|2021-01-1W125|1001|2020-12-01|2021-04-19|2021-04-28|2021-04-2W125|1001|2020-12-01|2021-06-02|2021-02-08|
WITH first_fill_date AS 
(
SELECT
f.[CUST_NO],f.[SERIES_NO],p.[PAUSE_END_DATE] , f.[FILL_DATE]
, ROW_NUMBER() OVER (PARTITION By f.[CUST_NO],f.[SERIES_NO],p.[PAUSE_END_DATE] ORDER BY f.[FILL_DATE] ASC) row_num
FROM FILL_DATE_HX f JOIN PAUSE_HX p 
ON f.[CUST_NO] = p.[CUST_NO] AND  f.[SERIES_NO] =  p.[SERIES_NO] AND f.[FILL_DATE] > p.[PAUSE_END_DATE]
) 
SELECT c.[CUST_NO], c.[SERIES_NO]
, CONVERT(date,[ACCT_OPENED]),CONVERT(date,[PAUSE_START_DATE]), CONVERT(date,p.[PAUSE_END_DATE])
,CONVERT(date,ff.[FILL_DATE]) as RESTART_REPLACEMENT_DATE
FROM CUSTOMER c INNER JOIN PAUSE_HX p ON c.[CUST_NO] = p.[CUST_NO] AND  c.[SERIES_NO] =  p.[SERIES_NO]
LEFT JOIN first_fill_date ff ON ff.[CUST_NO] = p.[CUST_NO] AND  ff.[SERIES_NO] =  p.[SERIES_NO] AND ff.[PAUSE_END_DATE] = p.[PAUSE_END_DATE] AND ff.row_num = 1

相关内容

最新更新