当前位置: 首页 > 面试题库 >

连续3个月发生的TSQL查找顺序

邹德泽
2023-03-14
问题内容

请帮助我生成以下查询。说我有客户表和订单表。

客户表

CustID CustName

1      AA     
2      BB
3      CC
4      DD

订单表

OrderID  OrderDate          CustID
100      01-JAN-2000        1  
101      05-FEB-2000        1     
102      10-MAR-2000        1 
103      01-NOV-2000        2    
104      05-APR-2001        2 
105      07-MAR-2002        2
106      01-JUL-2003        1
107      01-SEP-2004        4
108      01-APR-2005        4
109      01-MAY-2006        3 
110      05-MAY-2007        1  
111      07-JUN-2007        1
112      06-JUL-2007        1

我想找出连续三个月下订单的客户。(允许使用SQL Server 2005和2008进行查询)。

所需的输出是:

CustName      Year   OrderDate

    AA        2000  01-JAN-2000       
    AA        2000  05-FEB-2000
    AA        2000  10-MAR-2000

    AA        2007  05-MAY-2007        
    AA        2007  07-JUN-2007        
    AA        2007  06-JUL-2007

问题答案:

编辑: 摆脱或 MAX() OVER (PARTITION BY ...)那样似乎会削弱性能。

;WITH cte AS ( 
SELECT    CustID  ,
          OrderDate,
          DATEPART(YEAR, OrderDate)*12 + DATEPART(MONTH, OrderDate) AS YM
 FROM     Orders
 ),
 cte1 AS ( 
SELECT    CustID  ,
          OrderDate,
          YM,
          YM - DENSE_RANK() OVER (PARTITION BY CustID ORDER BY YM) AS G
 FROM     cte
 ),
 cte2 As
 (
 SELECT CustID  ,
          MIN(OrderDate) AS Mn,
          MAX(OrderDate) AS Mx
 FROM cte1
GROUP BY CustID, G
HAVING MAX(YM)-MIN(YM) >=2 
 )
SELECT     c.CustName, o.OrderDate, YEAR(o.OrderDate) AS YEAR
FROM         Customers AS c INNER JOIN
                      Orders AS o ON c.CustID = o.CustID
INNER JOIN  cte2 c2 ON c2.CustID = o.CustID and o.OrderDate between Mn and Mx
order by c.CustName, o.OrderDate


 类似资料:
  • 我正在进行密码检查。其中一个功能是查找输入的密码是否连续重复。我还没有代码,因为我不知道怎么做。 我发现这个正则表达式匹配两个或多个非连续的相同字符,但它只匹配重复的逗号。 以下是场景: 5236aaa121-重复模式,因为a连续重复3次 2312aa32aa-无重复字符 111111 ASD-重复模式,因为连续重复多次

  • 问题内容: 我已经搜索了此内容,但是所有类似的问题和答案都完全不同,无法正常工作。 我有一个包含以下字段的表格:人,事物,purdate。当某人购买每件新东西时,将输入一条新记录。 我想计算一个人连续购买了“事物”(thing01或thing02,没有关系)的月份。如果连续的休息日休息,则应重新开始计数。 封闭数据后,我想得出以下结论: 我知道我可以得到一个不同的人员列表,extract(purd

  • 问题内容: 如果我有串,我要检查,如果它作为一个连续存在 串 中,我可以使用: 在非连续子 序列 的情况下,我可以使用什么?例: 问题答案: 我不知道是否有内置功能,但是手动操作相当简单

  • 问题内容: 我需要查询方面的帮助。 我有这个简单的表: 看起来像这样: 我想为给定的readVal获得最后的连续行: 在上面的示例中将是: id:3 for readVal = 2 id:8 for readVal = 3 我尝试了以下查询: 只要该系列中没有缺失的ID,它就可以工作。在上面的示例中,编号4缺失,查询将不会返回预期的结果。 谢谢! 问题答案: 返回: 对于还需要最后一行的情况: 返

  • 问题内容: 我正在尝试使用蒙特卡洛算法查找下周的乐透数字包含连续数字的概率。我认为对数字进行排序可能会使实际查找连续项更加容易,但是在网上搜索了很多之后,似乎并没有什么真正可以帮助我寻找所需内容的信息 到目前为止,这就是我所知道的,我知道我将使用计数器来查找百万结果中的连续数,但实际上我只是为如何真正找到连续数而烦恼 问题答案: 首先我读错了问题,对不起,答案很抱歉! 好吧,让我们分手吧。那么首先

  • 问题内容: 我有一个sql表,用于存储股票的每日价格。收市后每天都会插入新的记录。我想找到价格连续上涨的股票。 该表有很多列,但这是相关的子集: 该列是主键。 在表中,股票编号1的收盘价每天都在增加。股票ID 3的波动很大,股票ID 2的价格在最后一天下跌。 我正在寻找这样的结果: 如果您可以获得带有连续条纹的日期的输出,那就更好了: 价格开始上涨的时间,牛市实际上结束的时间。 我认为这不是一个容