佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

搜索
查看: 915|回复: 8

filter record的问题。。。

[复制链接]
发表于 17-12-2008 10:44 AM | 显示全部楼层
高手!!!我改成我的版本了。。。可是我用了三个declare table。
第一和第二个table我用到2 inner join and few conditions
第三个我把第一和第二的table的资料整理出来。。。
请问这样会导致memory usage高或慢或其他问题吗?我的data都是很多的。。。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 15-12-2008 04:38 PM | 显示全部楼层 |阅读模式
我有两个table
table A:
id             date                                   description
1              15/12/2008 6:00pm         abc
2              15/12/2008 6:05pm         login
3              15/12/2008 6:10pm         logoff
4              15/12/2008 6:15pm         cba

table B:
id             date                             phase
1              15/12/2008 5:00pm      A
2              15/12/2008 6:06pm      B
3              15/12/2008 7:00pm      C

table A 存住全部发生的event, 包括user login 和logoff。
table B 存住一些特别的event,不会存在table A内的。
我想找出table B 中所有<B>不在</B>user login和logoff之间那段period所发生的event.
请问有什么方法吗?我用vb.net+mssql。还是单单mssql statement就可以做到了??
回复

使用道具 举报

发表于 15-12-2008 08:54 PM | 显示全部楼层
简单的。。。

首先。。。
先找到你要的login和logout的date.
我assume就有两个row的资料。。。。
extract 出来。。。。

再进table B 寻找 table B. datetime >=login datetime AND table B.datetime <= logout datetime

应该可以找到了。。。


可能有sql高手。。。
用一个statement就可以了。。。。
谢谢赐教。。。。
回复

使用道具 举报

 楼主| 发表于 16-12-2008 11:59 AM | 显示全部楼层
不好意思。。。没写清楚。。。login和logout会有很多recordby vb我写好了。。。不过很麻烦。。。要compare很多。。。record = "select * from tableB
loop each record
&#160;&#160; &#160;record2 = select from table A where date >= record.date and description="login" or                    description = "logoff"
&#160;&#160; &#160;loop each record2
&#160;&#160; &#160; &#160; &#160; &#160;if record2.description = "login"
&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160;if record.date < record2.date then &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&#160;
&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; insertrecord
&#160;&#160; &#160; &#160; &#160; else
&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160;if record.date > recprd2.date then
&#160;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;insertrecord
&#160;&#160; &#160; &#160; &#160; end if
&#160;&#160; &#160;end loop
end loop
&#160;没帮法用你的方法。。因为很多问题。。。比如只record到login的date或logout等等。。。不过好是很谢谢你。。。想问问看有没有高手可以更简单和快的。。。因为我的data很多。。。

[ 本帖最后由 CoLoUrGhOsT 于 16-12-2008 12:05 PM 编辑 ]
回复

使用道具 举报

发表于 17-12-2008 01:03 AM | 显示全部楼层
原帖由 CoLoUrGhOsT 于 16-12-2008 11:59 AM 发表
不好意思。。。没写清楚。。。login和logout会有很多recordby vb我写好了。。。不过很麻烦。。。要compare很多。。。record = "select * from tableB
loop each record
    record2 = select from  ...



如果没有parallel login 而且login & logoff in pair
e.g Login -> Logoff -> Login -> Logoff ......

尝试以下方法 (DB Level)
先在Query Analyzer执行,如果行得通,就写成Stored Procedure or Function

另一种方法是利用Cursor去traverse 那些record,比较容易明白
不过,许多人建议别用loop, 因为比较慢 (听说而已,我没试过)

  1. -- Declare a temp table
  2. DECLARE @loginPeriod TABLE (startTime datetime , endTime datetime);

  3. -- Insert Login period to temp table
  4. INSERT INTO @loginPeriod (startTime, endTime) (SELECT t1.dd
  5. 'startTime', (SELECT TOP 1 dd FROM tableA t2 WHERE t2.dd > t1.dd AND
  6. description = 'logoff' ORDER BY dd) 'endTime'
  7. FROM tableA t1
  8. WHERE t1.description = 'login')



  9. SELECT * FROM tableB
  10. WHERE id NOT IN (SELECT ID FROM tableB bb, @loginPeriod lp WHERE bb.dd BETWEEN lp.startTime AND lp.endTime)
复制代码

Test Data
--------------------------
TableA
1    2008-12-15 18:00:00.000    abc
2    2008-12-15 18:05:00.000    login
3    2008-12-15 18:10:00.000    logoff
4    2008-12-15 18:15:00.000    cba
5    2008-12-15 19:15:00.000    login
6    2008-12-15 19:25:00.000    logoff
8    2008-12-15 20:15:00.000    ggg

TableB
1    2008-12-15 17:00:00.000    A
2    2008-12-15 18:06:00.000    B
3    2008-12-15 18:07:00.000    C
4    2008-12-15 18:08:00.000    D
5    2008-12-15 19:00:00.000    E
6    2008-12-15 19:20:00.000    F
7    2008-12-15 20:00:00.000    G


Result
------------------
1    2008-12-15 17:00:00.000    A
5    2008-12-15 19:00:00.000    E
7    2008-12-15 20:00:00.000    G

[ 本帖最后由 sfkwan 于 17-12-2008 01:09 AM 编辑 ]
回复

使用道具 举报

发表于 17-12-2008 02:48 PM | 显示全部楼层
原帖由 CoLoUrGhOsT 于 17-12-2008 10:44 AM 发表
高手!!!我改成我的版本了。。。可是我用了三个declare table。
第一和第二个table我用到2 inner join and few conditions
第三个我把第一和第二的table的资料整理出来。。。
请问这样会导致memory usage高或慢 ...



多少Data? 1Mil? 1Mil - 5Mil? 5Mil - 10Mil? > 10Mil
如果有弄好Index,应该还好
快慢就决定于你的Query optimization (这个你就要请教高手了,我的 SQL & Optimization Skill 还是很烂)

[ 本帖最后由 sfkwan 于 17-12-2008 02:49 PM 编辑 ]
回复

使用道具 举报

Follow Us
 楼主| 发表于 19-12-2008 09:31 AM | 显示全部楼层
他会每天月来越多。。。所以以上的数目都有可能。。。。
好的。。。非常谢谢你。
回复

使用道具 举报

发表于 29-12-2008 10:16 PM | 显示全部楼层
原帖由 CoLoUrGhOsT 于 19-12-2008 09:31 AM 发表
他会每天月来越多。。。所以以上的数目都有可能。。。。
好的。。。非常谢谢你。


忘了说一个工具,对于SQL Performance tuning 非常有用,我也是靠他罢了
Query Analyzer : Menu -> Query -> Show Execution Plan, 然后执行你的 SQL
你可以从结果知道哪个部分需要最多的 Resource, 然后从中分析
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 30-12-2008 05:33 PM | 显示全部楼层
哈。。。我也在用着。。很不错下。。。不过不懂那个%会不会因为data的多寡而被影响。。。迟点要来做下实验。。。谢谢你
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT


本周最热论坛帖子本周最热论坛帖子

ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2026 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 22-4-2026 04:45 AM , Processed in 0.100682 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表