我一直试图解决这个问题,但无法做到这一点。
我想选择ID,表S日期,Type = 1和Type = 2的2个不同的计数,其中表P中的日期是> =表S中的最大日期,其中note = J,并且最大表P日期与表S日期之间的日期差异。
示例表数据:
Table S
Date ID Note
2/26/2014 688606 J
2/14/2014 688606 J
Table P
Date ID Type
7/10/2015 688606 1
7/9/2015 688606 1
7/8/2015 688606 1
7/7/2015 688606 2
1/2/2010 688606 1
1/1/2010 688606 2
理想的结果集:
S.Date S.ID P.MaxDate P.T1Count P.T2Count P.DateDiff
2/26/2014 688606 7/10/2015 3 1 499
我已经尝试了SUMs,但后来我无法弄清楚如何合并日期,因为SUM需要分组,日期都是唯一的。
我尝试使用ID对分区进行计数,但这会使计数包括表P中的所有数据,而不仅仅是那些日期为> =表S的数据。
非常感谢任何帮助。
谢谢,
这是我的第一步:
SELECT
S.ID,
S.DATE as SDATE,
P.DATE as PDATE,
P.TYPE,
COUNT(P.DATE) OVER (PARTITION BY P.ID) as NBR_T1,
(P.DATE - S.DATE)as NBR_DATES
FROM
P
JOIN
(
SELECT
DISTINCT(S.ID),
S.DATE,
S.NOTE
FROM
S
WHERE
S.DATE = (SELECT MAX(SS.DATE)
FROM SS
WHERE SS.ID = S.ID
AND SS.NOTE = 'J')
AND S.ID = '688606'
) S ON P.ID = S.ID
WHERE
P.TYPE = '1'
AND P.ID = '688606'
AND P.DATE >= S.DATE
ORDER BY
P.DATE DESC
答案 0 :(得分:0)
如果你真的只有2种类型,那么这个解决方案就可以了。如果你有N种类型,那么你需要N列,你需要使用PivotTable
。
希望这有帮助。
USE SomeDB;
CREATE TABLE S (dt DATETIME NOT NULL, sTableid INT NOT NULL);
INSERT INTO S VALUES ('2/26/2014', 688606), ('2/14/2014', 688606);
CREATE TABLE P (dt DATETIME NOT NULL, pTableid INT NOT NULL, typeID INT NOT NULL);
INSERT INTO P VALUES
('7/10/2015', 688606, 1),
('7/9/2015', 688606, 1),
('7/8/2015', 688606, 1),
('7/7/2015', 688606, 2),
('1/2/2010', 688606, 1),
('1/1/2010', 688606, 2);
WITH tmp AS (
SELECT pTableid, p.typeID, MAX(dt) maxDate, COUNT(1) cnt
FROM dbo.P
GROUP BY pTableid, p.typeID
)
SELECT s.dt,
s.sTableid,
(SELECT MAX(maxDate) FROM tmp WHERE tmp.pTableid = s.sTableid) maxDateOfAnyType,
(SELECT cnt FROM tmp WHERE tmp.pTableid = s.sTableid AND tmp.typeID = 1) t1Count,
(SELECT cnt FROM tmp WHERE tmp.pTableid = s.sTableid AND tmp.typeID = 2) t2Count,
DATEDIFF(DAY, s.dt, (SELECT MAX(maxDate) FROM tmp WHERE tmp.pTableid = s.sTableid)) daysBetween
FROM dbo.S s
DROP TABLE S;
DROP TABLE P;
答案 1 :(得分:0)
如果您首先在S
中聚合数据,这可能是最简单的 - 我喜欢CTE,然后将必要的聚合应用于P
中的相应数据。像这样:
-- Sample data.
declare @s table ([Date] date, [ID] bigint, [Note] char(1));
insert @s values
('2014-02-26', 688606, 'J'),
('2014-02-14', 688606, 'J');
declare @p table ([Date] date, [ID] bigint, [Type] int);
insert @p values
('2015-07-10', 688606, 1),
('2015-07-09', 688606, 1),
('2015-07-08', 688606, 1),
('2015-07-07', 688606, 2),
('2010-01-02', 688606, 1),
('2010-01-01', 688606, 2);
-- Step 1: Aggregate and filter the records you want in @s.
with [GroupS] as
(
select
[S].[ID],
[Date] = max([S].[Date])
from
@s [S]
where
[S].[Note] = 'J'
group by
[S].[ID]
)
-- Step 2: Aggregate the corresponding records in @p.
select
[S.Date] = [GroupS].[Date],
[S.ID] = [GroupS].[ID],
[P.MaxDate] = max([P].[Date]),
[P.T1Count] = sum(case [P].[Type] when 1 then 1 else 0 end),
[P.T2Count] = sum(case [P].[Type] when 2 then 1 else 0 end),
[P.DateDiff] = datediff(day, [GroupS].[Date], max([P].[Date]))
from
[GroupS]
inner join @p [P] on [GroupS].[ID] = [P].[ID]
where
[GroupS].[Date] <= [P].[Date]
group by
[GroupS].[Date],
[GroupS].[ID];
答案 2 :(得分:0)
另一种方法...我假设你已经创建了表S
和P
并使用了SQL Server 2012+
。
Declare @MDate datetime
SELECT @MDate = MAX(SS.DATE) FROM S SS WHERE SS.NOTE = 'J'
Select S.Date, S.ID, Max(P.Date) as 'MaxDate',
COUNT(IIF(convert(int,P.Type)=1, 1, NULL)) AS T1Count,
COUNT(IIF(convert(int,P.Type)=2, 1, NULL)) AS T2Count,
datediff(day, S.Date, Max(P.Date)) as 'DateDiff' from P
inner join S on P.ID = S.ID and S.Date >= @MDate
and P.Date >= @MDate
group by S.Date, S.ID