2012-10-01 51 views
7

在Enrollment_Changes表中,列出的電話型號是用戶在該日期更改FROM的電話。正確使用計數功能

如果在Enrollment_Changes沒有後續的變化,用戶切換到手機上列出P_Enrollment表

例如,用戶12345678就讀於2011年1月5日與RAZR。在2011年1月1日,他從RAZR變更。您可以在2012年5月19日的Enrollment_Changes上查看下一筆交易,以瞭解他所做的更改。

你會如何找到首次登錄iPhone 3的潛艇的計數?

這裏是我的代碼來創建表

創建表:TBL 1

USE [Test2] 
GO 

/****** Object: Table [dbo].[P_ENROLLMENT] ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[P_ENROLLMENT](
    [Subid ] [float] NULL, 
    [Enrollment_Date] [datetime] NULL, 
    [Channel] [nvarchar](255) NULL, 
    [Region] [nvarchar](255) NULL, 
    [Active_Status] [float] NULL, 
    [Drop_Date] [datetime] NULL, 
    [Phone_Model] [nvarchar](255) NULL 
) ON [PRIMARY] 

GO 

TBL 2

USE [Test2] 
GO 

/****** Object: Table [dbo].[ENROLLMENT_CHANGES]  ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[ENROLLMENT_CHANGES](
    [Subid] [float] NULL, 
    [Cdate] [datetime] NULL, 
    [Phone_Model] [nvarchar](255) NULL 
) ON [PRIMARY] 

GO 

插入TBL1

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12345678, '2011-01-05 00:00:00', 'Retail', 'Southeast', 1, NULL, 'iPhone 4'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12346178, '2011-03-13 00:00:00', 'Indirect Dealers', 'West', 1, NULL, 'HTC Hero'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12346679, '2011-05-19 00:00:00', 'Indirect Dealers', 'Southeast', 0, '2012-03-15 00:00:00', 'Droid 2'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12347190, '2011-07-25 00:00:00', 'Retail', 'Northeast', 0, '2012-05-21 00:00:00', 'iPhone 4'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12347701, '2011-08-14 00:00:00', 'Indirect Dealers', 'West', 1, NULL, 'HTC Hero'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12348212, '2011-09-30 00:00:00', 'Retail', 'West', 1, NULL, 'Droid 2'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12348723, '2011-10-20 00:00:00', 'Retail', 'Southeast', 1, NULL, 'Southeast'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12349234, '2012-01-06 00:00:00', 'Indirect Dealers', 'West', 0, '2012-02-14 00:00:00', 'West'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12349745, '2012-01-26 00:00:00', 'Retail', 'Northeast', 0, '2012-04-15 00:00:00', 'HTC Hero'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12350256, '2012-02-11 00:00:00', 'Retail', 'Southeast', 1, NULL, 'iPhone 4'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12350767, '2012-03-02 00:00:00', 'Indirect Dealers', 'West', 1, NULL, 'Sidekick'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12351278, '2012-04-18 00:00:00', 'Retail', 'Midwest', 1, NULL, 'iPhone 3'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12351789, '2012-05-08 00:00:00', 'Indirect Dealers', 'West', 0, '2012-07-04 00:00:00', 'iPhone 3'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12352300, '2012-06-24 00:00:00', 'Retail', 'Midwest', 1, NULL, 'Droid 2'); 

INSERT INTO [P_ENROLLMENT]([Subid ], [Enrollment_Date], [Channel], [Region], [Active_Status], [Drop_Date], [Phone_Model]) 
    VALUES(12352811, '2012-06-25 00:00:00', 'Retail', 'Southeast', 1, NULL, 'Sidekick'); 

插入TBL2

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12345678, '2011-11-01 00:00:00', 'RAZR'); 

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12346178, '2012-01-07 00:00:00', 'HTC Hero'); 

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12348723, '2012-01-28 00:00:00', 'RAZR'); 

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12350256, '2012-02-21 00:00:00', 'Blackberry Bold'); 

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12349745, '2012-05-05 00:00:00', 'HTC Hero'); 

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12345678, '2012-05-19 00:00:00', 'Palm Pre'); 

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12347190, '2012-05-20 00:00:00', 'HTC Hero'); 

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12350256, '2012-05-21 00:00:00', 'Blackberry Bold'); 

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12349234, '2012-06-04 00:00:00', 'Palm Pre'); 

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12346178, '2012-06-05 00:00:00', 'iPhone 3'); 

INSERT INTO [ENROLLMENT_CHANGES]([Subid], [Cdate], [Phone_Model]) 
    VALUES(12350767, '2012-06-10 00:00:00', 'iPhone 3'); 
+0

如果我正確理解問題並且我不確定我是否確實這麼做,那麼我認爲如果在enrollment_changes中沒有條目,則認爲第一個模型在p_enrollment中,否則它在enrollment_changes的第一個條目中。是對的嗎? – GilM

+2

關於你的第一個SO問題,包括所有的DDL,都非常棒。如果可以的話,我會給你5星。 – RichardTheKiwi

回答

4

爲計數

select COUNT(*) Total 
from 
(
    select e.*, 
     rn = row_number() over (partition by e.subid order by c.cdate desc), 
     first_model = coalesce(c.phone_model, e.phone_model) 
    from [P_ENROLLMENT] e 
    left join [ENROLLMENT_CHANGES] c on c.subid = e.subid 
) x 
where rn=1 and first_model = 'iPhone 3' 


所有記錄

select * 
from 
(
    select e.*, 
     rn = row_number() over (partition by e.subid order by c.cdate desc), 
     first_model = coalesce(c.phone_model, e.phone_model) 
    from [P_ENROLLMENT] e 
    left join [ENROLLMENT_CHANGES] c on c.subid = e.subid 
) x 
where rn=1 and first_model = 'iPhone 3' 
order by subid 
+0

我認爲這個邏輯是正確的,但是請求是針對COUNT的。 – GilM

+0

謝謝!更新。 – RichardTheKiwi

1

你想知道的話,表中的第一個記錄是一個iPhone 3事情是這樣的:

select count(*) 
from (select e.*, 
      row_number() over (partition by subid order by enrollment_date) as seqnum 
     from p_enrollment e 
    ) e 
where seqnum = 1 and phone_model = 'iPhone 3' 
1

也許我想得簡單,但不會下面的任你在找什麼?:

SELECT  Phone_Model 
      , COUNT(*) AS Initially_Enrolled 
FROM  p_enrollment 
GROUP BY Phone_Model 

(工作SQLFiddle:http://sqlfiddle.com/#!3/68258/4

SELECT  COUNT(*) AS Initially_Enrolled 
FROM  p_enrollment 
WHERE  Phone_Model = 'iPhone 3' 

(working SQLFiddle:http://sqlfiddle.com/#!3/68258/3

由於您只希望進行初始註冊,因此ENROLLMENT_CHANGES表不相關。

+0

你*可能*想得太簡單。我相信p_enrolment包含CURRENT值,_changes包含歷史值。 – RichardTheKiwi