Tsql 子查询的T-SQL最小值

Tsql 子查询的T-SQL最小值,tsql,Tsql,我有一个查询,试图返回一个客户编号以及他们连续成为客户的年数。它通过建立一个活动年和客户的列表来实现这一点,然后将其与可能的年份列表进行比较,并返回没有活动的最低年份。问题是可能的年份列表是一个大的交叉连接。我想,如果我能在MIN中烘焙EXCEPT逻辑,并重复使用我列出的10年可能的时间,这将运行得更快 查询: SELECT SUBSTRING(D,3,9) AS Cust, MIN(SUBSTRING(D,1,1)) AS Years FROM (SELECT DISTINCT CAST

我有一个查询,试图返回一个客户编号以及他们连续成为客户的年数。它通过建立一个活动年和客户的列表来实现这一点,然后将其与可能的年份列表进行比较,并返回没有活动的最低年份。问题是可能的年份列表是一个大的交叉连接。我想,如果我能在MIN中烘焙EXCEPT逻辑,并重复使用我列出的10年可能的时间,这将运行得更快

查询:

SELECT SUBSTRING(D,3,9) AS Cust, MIN(SUBSTRING(D,1,1)) AS Years FROM 
(SELECT DISTINCT
  CAST (y.years AS VARCHAR) + '-' + CAST(pm.BillToCustomerId AS VARCHAR ) AS D
   FROM [DW_Mart].[dbo].[vProMaster] pm
   cross join 
   (VALUES ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9')) AS y(years)
        EXCEPT
    SELECT DISTINCT CAST (DATEDIFF(YEAR,[ShipmentDate],CURRENT_TIMESTAMP) AS VARCHAR)
 + '-' + CAST ([BillToCustomerId] AS VARCHAR ) AS D
   FROM [DW_Mart].[dbo].[vProMaster] pm ) AS X GROUP BY SUBSTRING(D,3,9)
我的伪代码修改查询:

SELECT SUBSTRING(D,3,9) AS Cust, MIN((VALUES ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9')) EXCEPT SUBSTRING(D,1,1)) AS Years FROM 
(SELECT DISTINCT CAST (DATEDIFF(YEAR,[ShipmentDate],CURRENT_TIMESTAMP) AS VARCHAR)
 + '-' + CAST ([BillToCustomerId] AS VARCHAR ) AS D
   FROM [DW_Mart].[dbo].[vProMaster] pm ) AS X GROUP BY SUBSTRING(D,3,9)

像…这样的怎么样

select billtocustomerid, max( DATEDIFF(YEAR,[ShipmentDate],CURRENT_TIMESTAMP))
from dw_mart.dbo.vpromaster
group by billtocustomerid

结果证明交叉连接破坏了服务器。 我不知道我有多为这只小狗感到骄傲,但它工作起来很快:

SELECT SUBSTRING(D,10,9) AS Cust,
CHARINDEX('1',RIGHT('00000000'+(CAST (11111111-SUM(CAST(SUBSTRING(D,1,8) AS INT)) AS VARCHAR)),8)) AS Years
  FROM 
(SELECT DISTINCT RIGHT('00000000'+(CAST (POWER(10,(FLOOR(8-DATEDIFF(MONTH,[ShipmentDate],CURRENT_TIMESTAMP)/12))) AS VARCHAR)),8)
+ '-' + CAST ([BillToCustomerId] AS VARCHAR ) AS D
FROM [DW_Mart].[dbo].[vProMaster] pm
where ShipmentDate < CURRENT_TIMESTAMP and ShipmentDate > DATEADD(YEAR,-8,CURRENT_TIMESTAMP)) AS X GROUP BY SUBSTRING(D,10,9)

接得好,但我应该说得更清楚。我们正在寻找连续几年的活动。如果他们在第0、1、2和4年有活动,答案是3。这就是为什么在可能年份列表中使用“除外”的方法效果很好,但速度很慢。哦,连续,这是一个关键词: