Foxtable(狐表)用户栏目专家坐堂 → 统计不重复值计数


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

主题:统计不重复值计数

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


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2016/11/14 22:12:00 [只看该作者]

还是不行。我采用先插入,再更新的方法。

Dim cm d As New SQLComman d
cm d.ConnectionNam e = "vip"
For Each dr As DataRow In DataTables("销售明细").DataRows
    cm d.CommandText =" insert into 销售明细(单号,销售时间) values ( '" & d r("单号") & "','" & d r("销售时间") & "')"
    cm d.ExecuteNonQuery()
Next

cm d.commandtext = "updat e 销售明细 s et 单数 = 1 wher e 单数 is null"
cm d.ExecuteNonQuery()

 

但这样好慢:

因为我们每天都要上传一次数据,这样每次都要从上百万条记录中找到   wher e 单数 is null   的才更新

 

 

我在想能不能在每天导入的数据里去 更新,每次也才几千条。这样会快点。

[此贴子已经被作者于2016/11/14 22:12:22编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107850 积分:548607 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/11/14 22:22:00 [只看该作者]

不知道你的业务逻辑是什么,具体要实现什么功能。

不过批量插入可以参考一下:http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=84350

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


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2016/11/14 22:45:00 [只看该作者]

Dim cm d As New SQLComman d
cm d.ConnectionNam e = "vip"

cm d.commandtext = "updat e 销售明细 s et 单数 = 1 wher e 单数 is null"
cm d.ExecuteNonQuery()

 

我们每天都要插入一些数据,插入完了之后要update 单数 这个列的值,把没有更改的(null值)改为 1.

每次去更新,都好慢。好像是从整个数据表上百万条记录里去找的。

 

我的意思是每次在插入后先找出这些刚刚插入的 单数 is  null  的记录 ,每次也就五六千条。 找出来后,再update 为 1

 

或者在插入前,先把表的的 单数  的值给改成1 了,再 插入。

 

 

[此贴子已经被作者于2016/11/14 22:48:25编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  14楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107850 积分:548607 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/11/14 23:03:00 [只看该作者]

1、在插入之前就把单数 为空的置为1

2、单数加上索引试试
插入之前先取得最大的主键值,然后sql

updat e 销售明细 s et 单数 = 1 wher e 主键 > 插入前的最大值 and 单数 is null



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


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2016/11/15 9:46:00 [只看该作者]

第二种方法没有起到作用,不知道是不是我的写法不对,更新两条记录需要这么长时间如图:


图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20161115094154.png
图片点击可在新窗口打开查看

我试一下第1种方法

[此贴子已经被作者于2016/11/15 9:46:44编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2016/11/15 9:57:00 [只看该作者]

第一种方法:先在插入前的内部表更改好值,要得到如下效果


图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20161115095126.png
图片点击可在新窗口打开查看

 

之前用updat e 的方法是:

cmd.commandtext = "updat e 销售明细 set 单数 = 0 where _Identify > " & val & " And 单号 In (Selec t 单号 from 销售明细 group by 单号 having count(*) > 1) And [_Identify] not In  (Selec t min([_Identify]) from 销售明细 group by 单号 having count(*) > 1) And 单数 Is null "
cmd.ExecuteNonQuery()

 

cmd.commandtext = "updat e 销售明细 set 单数 = 1 where _Identify > " & val & " and 单数 is null"
cmd.ExecuteNonQuery()

 

那在内部表要怎么做呢?用DataColChanged吗?

我之前也是用 updat e 内部表的方法,但是还要在Load出来然后再批量插入。Load出来,有一两万条数据的话就很慢。

 


 

[此贴子已经被作者于2016/11/15 9:57:43编辑过]

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


加好友 发短信
等级:二尾狐 帖子:573 积分:2961 威望:0 精华:0 注册:2016/10/27 14:33:00
  发帖心情 Post By:2016/11/15 10:05:00 [只看该作者]

 更新一条和更新全部需要的时间是一样的。

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


加好友 发短信
等级:二尾狐 帖子:573 积分:2961 威望:0 精华:0 注册:2016/10/27 14:33:00
  发帖心情 Post By:2016/11/15 10:08:00 [只看该作者]

 执行多条sql语句,尽量用事务来处理。

 

 不要每次计算一次,你可以定期一次性计算。


 回到顶部
帅哥,在线噢!
有点蓝
  19楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107850 积分:548607 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/11/15 10:18:00 [只看该作者]

1、试试
cmd.commandtext = "updat e 销售明细 set 单数 = 0 where _Identify > " & val & " And 单号 In (Selec t 单号 from 销售明细 where _Identify > " & val & " group by 单号 having count(*) > 1) And [_Identify] not In  (Selec t min([_Identify]) from 销售明细 where _Identify > " & val & " group by 单号 having count(*) > 1) And 单数 Is null "

2、第一种方法,参考,不过需要对应的单号都要加载
Tables("表A").RepeatFilter("单号",1)
For Each r As Row In Tables("表A").Rows
    r("单数") = 1
Next
DataTables("表A").ReplaceFor("单数",0,"单数 is null")
Tables("表A").ApplyFilter = False

[此贴子已经被作者于2016/11/15 10:19:43编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  20楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107850 积分:548607 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/11/15 10:23:00 [只看该作者]

sql用到了in和分组,所以基本都是全表扫描,效率比较低。或者考虑用存储过程处理吧,在存储过程里使用游标循环处理看会不会好点

 回到顶部
总数 21 上一页 1 2 3 下一页