Foxtable(狐表)用户栏目专家坐堂 → [求助]关于查询效率方面的问题


  共有2625人关注过本帖树形打印复制链接

主题:[求助]关于查询效率方面的问题

帅哥哟,离线,有人找我吗?
paniwangji
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:181 积分:1620 威望:0 精华:0 注册:2013/4/25 14:05:00
[求助]关于查询效率方面的问题  发帖心情 Post By:2014/12/9 11:14:00 [只看该作者]

我想实现的效果如下:
第一列  - 日期
第二列  - 查询条件
第三列  - 名称

2014-1-4    8      A
2014-1-5    8.5   A
2014-1-6    9     A
2014-1-7    6     A
2014-1-10  5     A
2014-1-11  8     A
2014-1-12  6     A
2014-1-13  10   A
2014-1-14  7     A
2014-1-18  8     A
2014-1-19  7     A
2014-1-22  8     A
2014-1-4    18    B
2014-1-5    16   B
2014-1-8    29   B
2014-1-9    36   B
2014-1-10  25   B
2014-1-11  18   B
2014-1-12  26   B
2014-1-13  19   B
2014-1-14  17   B
2014-1-18  18   B
2014-1-19  17   B
2014-1-22  18   B


上面是我截取的部分数据,我需要根据数据的顺序特征查询到是属于哪个名称的值,并能告诉我时间段;
例:已知  18,16,29  这3个数,需要结果为:“B :2014-1-4至2014-1-8” 


因为日期列不是连贯日期,目前我用的办法是

Dim drs As New List(of DataRow) = DataTables(Tablename).SQLSelect(“条件一”)

然后在从drs中逐个遍历,每条记录都先判断时间,加1天有没有记录,如果没有就再加1天,直到有记录然后判断记录的值是否符合条件二,以此类推,这样的查询思路,如果数据少的话这样效率还可以,但是目前我的数据有百万条,名称也有几百个,请问有没有更好的思路能让我的查询效率更高一些?

    

[此贴子已经被作者于2014-12-9 11:26:51编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/12/9 11:17:00 [只看该作者]

 做个带数据的例子上来,说明要怎么查。

 回到顶部
帅哥哟,离线,有人找我吗?
paniwangji
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:181 积分:1620 威望:0 精华:0 注册:2013/4/25 14:05:00
  发帖心情 Post By:2014/12/9 11:23:00 [只看该作者]

数据很简单 就上面3列,但是就是查询起来比较费时间,老师能告诉我一个思路也可以。

 回到顶部
帅哥哟,离线,有人找我吗?
lsy
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/12/9 11:30:00 [只看该作者]

上数据,详细说明需求,一好理解,二好测试。

楼主自己知道,不代表别人知道。

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/12/9 11:30:00 [只看该作者]

 组合成条件直接查啊,查出说有数据后,想怎么处理就怎么处理啊

 

"第一例 in ('18','16','29')"


 回到顶部
帅哥哟,离线,有人找我吗?
paniwangji
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:181 积分:1620 威望:0 精华:0 注册:2013/4/25 14:05:00
  发帖心情 Post By:2014/12/9 12:47:00 [只看该作者]

有点甜老师,我这个是SQL的数据库,日期也不是按照从上到下这样的顺序排列的,而且最麻烦的是很多名称之间的数值都很近似,如果有很多包含 ('18','16','29') 这些数字但日期不是连续的也会被查出来吧。

 回到顶部
帅哥哟,离线,有人找我吗?
paniwangji
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:181 积分:1620 威望:0 精华:0 注册:2013/4/25 14:05:00
  发帖心情 Post By:2014/12/9 13:08:00 [只看该作者]

中午刚做了一个例子,大概就是这个效果。例子中有说明,谢谢了!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:例子.rar

[此贴子已经被作者于2014-12-9 13:11:32编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
lsy
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/12/9 14:23:00 [只看该作者]

1
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:查找时间范围.table


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/12/9 14:51:00 [只看该作者]

  汗

 

Dim filter As String = ""
Dim ls_source As new List(Of String)
For i As Integer = 1 To 7
    Dim val As String = e.Form.Controls("TextBox" & i).Text
    If val > "" Then
        filter &=  val & ","
        If ls_source.Contains(val) = False Then
            ls_source.Add(val)
        End If
    End If
Next

Dim str As String = ""
Dim ls As New List(of String)

Dim pname = ""
Dim temp = ""
Dim count As Integer
For Each dr As DataRow In DataTables("表A").SQLSelect("补助1 in (" & filter.Trim(",") & ")", "", "名称,时间")
    If dr("名称") <> pname Then
        If ls.Count = ls_source.Count Then
            str &= pname & "(" & temp & ")"
        End If
        ls.Clear
        pname = dr("名称")
        temp = ""
    End If
    If ls_source.Contains(dr("补助1")) Then
        If ls.Contains(dr("补助1")) = False Then
            ls.Add(dr("补助1"))
            temp &= dr("时间") & "|"
        End If
    End If
Next

e.Form.Controls("结果显示").Text = str


 回到顶部