繁体   English   中英

按值分组的列中连续月份的查询结果

[英]Query Results For Consecutive Months In Column Grouped By Value

以下是示例数据:

Name | Hours | RDate       | Company |
------------------------------------
A    |0      |2014-08-01   |W
A    |0      |2014-07-01   |W
A    |0      |2014-06-01   |W
A    |0      |2014-05-01   |W
B    |0      |2014-08-01   |X
C    |0      |2014-07-01   |Y
C    |0      |2014-06-01   |Y
D    |0      |2014-08-01   |V     
D    |0      |2014-07-01   |Z

以下是我想要的结果:

Name | Hours | RDate       | Company |
------------------------------------
A    |0      |2014-08-01   |W
A    |0      |2014-07-01   |W
A    |0      |2014-06-01   |W
A    |0      |2014-05-01   |W
C    |0      |2014-07-01   |Y
C    |0      |2014-06-01   |Y

所以问题是:

对于相同的namename ,我如何仅在RDate连续的月份中获得结果,即列RDate年1月1日, RDate年7月1 2014-08-01, 2014-07-01RDate年8月1日, RDate年6月1 2014-08-01, 2014-06-01 )同company

我认为这是“连续日期分组岛”问题的一种变体。

;WITH Cte AS(
    SELECT *,
        RN = DATEADD(MONTH, - ROW_NUMBER() OVER (PARTITION BY Name, Company ORDER BY RDate), RDate)
    FROM Test
)
,CteCount AS(
    SELECT *,
        CC = COUNT(*) OVER(PARTITION BY Name, Company, RN)
    FROM Cte
)
SELECT
    Name, Hours, RDate, Company
FROM CteCount
WHERE CC > 1

SQL字段

尽管@wewesthemenace的答案效率更高,但我还是尝试使用自己正在尝试的解决方案弄清楚自己的想法,并且它可以工作。 将先前标记的答案保留为已标记,因为这样更好。 这实际上也很好:

SELECT 
    one.*
FROM 
    foo one 
INNER JOIN 
    foo two
ON 
    (one.Name = two.Name and one.Company = two.Company) 
WHERE
    CONVERT(int,FORMAT(two.Date, 'yyyyMM')) - CONVERT(int,FORMAT(one.ACSS_Date, 'yyyyMM')) = 1
ORDER BY
    one.Name
    ,one.Date DESC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM