斯坦福 IT

数据库大神请点进来,有道SQL面试题求帮助

最大赞力
0.00
当前赞力
100.00%
感觉目前回答的思路好像都不大对,简单说说我的想法:
1. 第一个 WHERE date = '2011-12-31', 不要管他,这个给人带了很多confusion, 你可以把它当成任何一个Where Condition, 就像Where CompanyName='xxx'.
反正是得到一个DataSet, 这个时间点可以完全忽略。

2. 两个关键的时间点,第一个是ChangeDate, 像题目中的'2018-02-22 14:42:22', 是Hisotry Date, 另外一个其实是隐含的时间点,题目中没有给出了,但实际上
很重要,就是当前的时间点,CurrentTime = GetDate()

3. 所有的DataSet还是只能从主DataTable里选取,这是唯一的Source,但是主DataTable里只有当前时间点的数据,所以也要用到Audit Table.

4. 基本思路就是: SELECT * FROM dbo.data1 WHERE date = '2011-12-31', 得到当前时间点的DataSet, 然后再Revert所有的Changes between History Data between Current Time from audit Table:
分三种:Insert的必须要Exclude, Delete的要Union起来,Update的要找回原值。

SELECT * FROM dbo.data1 WHERE date = '2011-12-31' AND PrimaryID NOT IN (SELECT PrimaryID FROM data_audit_data1 WHERE date = '2011-12-31' and TriggerType='Insert' and ChangeDate > '2018-02-22 14:42:22' )
UNION
SELECT * FROM data_audit_data1 WHERE date = '2011-12-31' and TriggerType='Delete' and ChangeDate > '2018-02-22 14:42:22'

这个可以把Hisotry Data和Current Time之间的 Insert和Delete给 Revert回去,

还有一个Update的比较麻烦一点,因为同样一个PrimaryID可能会被Update几次,应该是只用最早时间的的一次Record的原值,这个部分就懒得写了,把这部分和上面的DataSet合并
,就得到你想要的结果了。

上面的所有的只是思路和抽象代码,你理解了剩下的应该很容易写出来的。
感谢,前两天忙着期末考没时间写,我照着您的代码和楼上各位数据库大神的指导差不多写出来了。
代码:
ALTER FUNCTION [dbo].[data1_PIT](@data_date smalldatetime, @as_of_date datetime)
RETURNS TABLE
AS
RETURN
(
    WITH TMP_1 AS (SELECT  *, ROW_NUMBER() OVER (PARTITION BY id_security ORDER BY ChangeDate ASC) rn
FROM  data_audit.data1 WHERE date = @data_date AND ChangeDate >=  @as_of_date),
TMP_2 AS (SELECT * FROM TMP_1 WHERE rn = 1)
SELECT * FROM data1
    WHERE date = @data_date
    AND id_security NOT IN (SELECT id_security FROM TMP_2)
    AND AddDate <= @as_of_date
UNION
SELECT
    date,id_security,column6,column7,column10,column11,column12,column13,column14,column15,column16,column17,column18,column19,column20,column21,column22,
    column23,column24,column25,column26,column27,column28,column29,column30,column31,column32,column33,column34,column35,column36,column37,column38,column39,
    column40,column41,column42,column43,column44,column45,AddLoginID,AddDate,column48,column49,column50,column51,column52,column53,column54,column55,column56,
    column57,column58,column59,column60,column61,column62,column64,column65,column66,column67,column68,column69,column70,column71,column72 
FROM TMP_2
)
 
最大赞力
0.00
当前赞力
100.00%
感谢,前两天忙着期末考没时间写,我照着您的代码和楼上各位数据库大神的指导差不多写出来了。
代码:
ALTER FUNCTION [dbo].[data1_PIT](@data_date smalldatetime, @as_of_date datetime)
RETURNS TABLE
AS
RETURN
(
    WITH TMP_1 AS (SELECT  *, ROW_NUMBER() OVER (PARTITION BY id_security ORDER BY ChangeDate ASC) rn
FROM  data_audit.data1 WHERE date = @data_date AND ChangeDate >=  @as_of_date),
TMP_2 AS (SELECT * FROM TMP_1 WHERE rn = 1)
SELECT * FROM data1
    WHERE date = @data_date
    AND id_security NOT IN (SELECT id_security FROM TMP_2)
    AND AddDate <= @as_of_date
UNION
SELECT
    date,id_security,column6,column7,column10,column11,column12,column13,column14,column15,column16,column17,column18,column19,column20,column21,column22,
    column23,column24,column25,column26,column27,column28,column29,column30,column31,column32,column33,column34,column35,column36,column37,column38,column39,
    column40,column41,column42,column43,column44,column45,AddLoginID,AddDate,column48,column49,column50,column51,column52,column53,column54,column55,column56,
    column57,column58,column59,column60,column61,column62,column64,column65,column66,column67,column68,column69,column70,column71,column72
FROM TMP_2
)
这sql……天啦......
 
最大赞力
0.00
当前赞力
100.00%
跟大家汇报一下

在星期六童鞋惊呼的天啦。。。又不肯提供帮助的情况下,我硬着头皮把作业交了上去。很快面试官就打来电话说非常满意并约好了下次面试的时间。前后一共三次技术面一次行为面一次笔试,终于拿到了offer。

昨天考完了最后一门课的期末考,结束了大学四年的全部考试。这段时间压力非常大也非常忙,但收获也是满满的。在此特别来感谢楼上各位帮助过我的童鞋,谢谢你们!让我一个完全没学过数据库的小白拿到了offer
 
最大赞力
0.00
当前赞力
100.00%
跟大家汇报一下

在星期六童鞋惊呼的天啦。。。又不肯提供帮助的情况下,我硬着头皮把作业交了上去。很快面试官就打来电话说非常满意并约好了下次面试的时间。前后一共三次技术面一次行为面一次笔试,终于拿到了offer。

昨天考完了最后一门课的期末考,结束了大学四年的全部考试。这段时间压力非常大也非常忙,但收获也是满满的。在此特别来感谢楼上各位帮助过我的童鞋,谢谢你们!让我一个完全没学过数据库的小白拿到了offer
恭喜你同时想说他眼瞎啊,:)
 
最大赞力
0.00
当前赞力
100.00%
恭喜恭喜, 面试 官也知道 ,学习 sql 的语法给点时间 就能够, 但是 思路 不容易培养。
你自己 思路是清晰的 这是他们要你的主要原因, 只是不熟 sql 而已。
而且你也看到了 这么多 我们这些 干了 这么多年的人 也不咋地。
本身 数学 就比计算机难。 能学数学的 肯定 学计算机 so easy.
 
最大赞力
0.00
当前赞力
100.00%
跟大家汇报一下

在星期六童鞋惊呼的天啦。。。又不肯提供帮助的情况下,我硬着头皮把作业交了上去。很快面试官就打来电话说非常满意并约好了下次面试的时间。前后一共三次技术面一次行为面一次笔试,终于拿到了offer。

昨天考完了最后一门课的期末考,结束了大学四年的全部考试。这段时间压力非常大也非常忙,但收获也是满满的。在此特别来感谢楼上各位帮助过我的童鞋,谢谢你们!让我一个完全没学过数据库的小白拿到了offer
恭喜,精神可嘉
 
最大赞力
0.00
当前赞力
100.00%
恭喜恭喜, 面试 官也知道 ,学习 sql 的语法给点时间 就能够, 但是 思路 不容易培养。
你自己 思路是清晰的 这是他们要你的主要原因, 只是不熟 sql 而已。
而且你也看到了 这么多 我们这些 干了 这么多年的人 也不咋地。
本身 数学 就比计算机难。 能学数学的 肯定 学计算机 so easy.
谢谢鼓励!您说的没错,我确实需要多多学习数据库知识,毕竟对full stack developer来说也是必须的技能。家园网卧虎藏龙,以后碰到各种各样技术问题还是要向你们求助呀!
 

Similar threads

家园推荐黄页

家园币系统数据

家园币池子报价
家园币最新成交价
家园币总发行量
加元现金总量
家园币总成交量
家园币总成交价值

池子家园币总量
池子加元现金总量
池子币总量
1池子币现价
池子家园币总手续费
池子加元总手续费
入池家园币年化收益率
入池加元年化收益率

微比特币最新报价
毫以太币最新报价
微比特币总量
毫以太币总量
家园币储备总净值
家园币比特币储备
家园币以太币储备
比特币的加元报价
以太币的加元报价
USDT的加元报价

交易币种/月度交易量
家园币
加元交易对(比特币等)
USDT交易对(比特币等)
顶部