ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: yuk_yu

[求助] 数据对比,要求高效!

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-10 09:15 | 显示全部楼层
我的数据非常简单,逻辑也不太复杂,只是对比量有点大,请大佬们给出完整的SQL或者 VBA code,谢谢!!

image.png

TA的精华主题

TA的得分主题

发表于 2024-10-10 11:47 | 显示全部楼层
本帖最后由 一招秒杀 于 2024-10-10 12:54 编辑
kevinchengcw 发表于 2024-10-10 09:11
你也同样只谈处理速度,从数据读取到处理结果按格式要求写入工作表的完整时间不也是一直不谈,何况你那个 ...

都说 软件 = 结构 + 算法,如果你专门学过数据库,你就会知道 数据库的设计有几大范式,为了保证数据的完整性等等,还有主键和外键的设置,重复的数据 就是脏数据,根本不应该进规范的数据库,为了取唯一,只需要一个 Distinct 或者 Group By 处理下,任选择其一即可,这么简单而顺手的事情。
还有数据库 最重要的功能就是存储数据,而不是 非要用 Excel 存储数据,就楼主的数据而言,我们也看到它处理的数据都已经在数据库中了,查询结果的数据,复制后就可以粘贴到 Excel Word 记事本 等其他程序中了,你完全没用过,所以不知道,我能理解。
你用了60行代码(姑且认为),而我只用了2个简单的Select 语句,只是为了不让它拉得太长,分成了4行,而且这两个语句其实绝大部分是相同的,用到的函数都是SQL 几十年前就有的标准函数,而不是我自己另外写的自定义函数,懂SQL的一看就明白了。 写这点代码,其实1分钟都不需要,根本用不了10分钟。我是为了尽快高效解决问题,不是为了钓鱼,更不是为了摸鱼。
你要 0.326秒 难道就超越了 0.05秒?
人家也是用SQL解决问题,用了11个Select 而我只用了2个,也差得一塌糊涂,远不如你,无法承认别人优秀,你为什么要诋毁? 踩上几脚?唯有这样方能显得你优秀吗?
以上这么多项对比,为什么你每样都是双重标准? 就不能公平一点吗?

TA的精华主题

TA的得分主题

发表于 2024-10-10 12:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
yuk_yu 发表于 2024-10-10 09:15
我的数据非常简单,逻辑也不太复杂,只是对比量有点大,请大佬们给出完整的SQL或者 VBA code,谢谢!!

1句2行,并且绝大部分相同,多么简单啊。
  1. With T  As (Select Part,String_Agg(Avl,',')  Within Group (Order By Avl) S From Raw2 Group By Part)
  2.                         Select S,        String_Agg(Part,',') Within Group (Order By Part)P From T    Group By S Having Count(*)>1
复制代码
String_AggWithinGroupOrderBy2.png

TA的精华主题

TA的得分主题

发表于 2024-10-10 12:37 | 显示全部楼层
一招秒杀 发表于 2024-10-10 11:47
都说 软件 = 结构 + 算法,如果你专门学过数据库,你就会知道 数据库的设计有几大范式,为了保证数据的完 ...

口口声声数据库,数据库的高效与你何干,而且这个版块叫Excel VBA程序开发,玩数据库的就不应该来自讨没趣,关键是自称别人语言老旧,还拿不出碾压的优势,只能比短,我的跑的快我自己写的,你的跑的快跟你有几毛钱的关系呢,法拉利跑得快又不是只有你能开,你也山寨一个跑得快的看看呗

TA的精华主题

TA的得分主题

发表于 2024-10-10 12:45 | 显示全部楼层
2行      对 60行   算不算碾压 ?
1分钟  对 10分钟 算不算碾压 ?
0.05秒 对  0.32 秒  算不算碾压 ?
多少人用 SQL, 解决本题 还有谁 比我更 精简 快速 ?
你的不能见人的60行代码,又有什么 可圈可点 ?
我用了人家的 SQL , 难道 Excel 就是你开发的?
什么逻辑? 多么无知 可笑 的 双重标准 !

TA的精华主题

TA的得分主题

发表于 2024-10-10 12:54 | 显示全部楼层
一个一直有推进的商业化语言对比30年前的单线程古早语言,没有10倍以上的速度优势不要拿出来丢人,而且我那0.3秒是老旧机器上全过程完成用的时间,你的0.05是哪段时间自己没点数吗

TA的精华主题

TA的得分主题

发表于 2024-10-10 13:01 | 显示全部楼层
楼上一直吵吵,二句也行,60行也行,反正我们运行不了。写再少也是一堆无用的文字,至少VBA还能用用。能用为上。

TA的精华主题

TA的得分主题

发表于 2024-10-10 13:57 | 显示全部楼层
kevinchengcw 发表于 2024-10-10 12:54
一个一直有推进的商业化语言对比30年前的单线程古早语言,没有10倍以上的速度优势不要拿出来丢人,而且我那 ...

一个那么简单的 1+1=2,再新的优秀语言 需要的时间也差不多。 Select 1 这么简单也需要0.03秒,处理了几万条数据也才 0.05秒已经是一个非常优秀的速度了,SQL的多线程体现在海量数据处理时,我的2行代码 你是见到了,你那60行 还是不能见人吗? 我无法想象是怎么样的低级和幼稚,你拿出一点 优秀的 代码或者算法 来显摆一下,让我羡慕一下。

TA的精华主题

TA的得分主题

发表于 2024-10-10 14:04 | 显示全部楼层
不就想知道我有没有实现吗,代码给你,自己去验证呗
  1. Sub test2()
  2. Dim Dic, Dict, Arr, Arrt, Tmp, N&, I&, K&, P&, S$, mTimer#, T#
  3. mTimer = Timer: T = Timer
  4. Set Dic = CreateObject("scripting.dictionary")
  5. Set Dict = CreateObject("scripting.dictionary")
  6. Debug.Print "创建字典用时:"; Timer - T: T = Timer
  7. With ThisWorkbook
  8.   With .Worksheets("Raw Data"): Arr = .Range("a2:b" & .Cells(.Rows.Count, 1).End(3).Row).Formula: End With
  9.   Debug.Print "读取数据用时:"; Timer - T: T = Timer
  10.   For N = LBound(Arr) To UBound(Arr)
  11.       If Dic(Arr(N, 1)) = "" Then
  12.         Dic(Arr(N, 1)) = vbBack & Arr(N, 2) & vbBack
  13.       ElseIf InStr(Dic(Arr(N, 1)), vbBack & Arr(N, 2) & vbBack) = 0 Then
  14.         Dic(Arr(N, 1)) = Dic(Arr(N, 1)) & Arr(N, 2) & vbBack
  15.       End If
  16.   Next N
  17.   Debug.Print "整理数据用时:"; Timer - T: T = Timer
  18.   Arrt = Dic.Keys
  19.   For N = LBound(Arrt) To UBound(Arrt)
  20.     Arr = Split(Dic(Arrt(N)), vbBack)
  21.     If UBound(Arr) - LBound(Arr) > 2 Then
  22.       For I = LBound(Arr) + 1 To UBound(Arr) - 2
  23.         K = I
  24.         For P = I + 1 To UBound(Arr) - 1
  25.           If StrComp(Arr(K), Arr(P)) = 1 Then K = P
  26.         Next P
  27.         If K <> I Then S = Arr(I): Arr(I) = Arr(K): Arr(K) = S
  28.       Next I
  29.     End If
  30.     S = Join(Arr, "||")
  31.     If Dict(S) = "" Then
  32.       Dict(S) = vbBack & Arrt(N) & vbBack
  33.     ElseIf InStr(Dict(S), vbBack & Arrt(N) & vbBack) = 0 Then
  34.       Dict(S) = Dict(S) & Arrt(N) & vbBack
  35.     End If
  36.   Next N
  37.   Debug.Print "提取结果用时:"; Timer - T: T = Timer
  38.   P = 0: K = 0
  39.   Arr = Dict.Keys: ReDim Arrt(LBound(Arr) + 1 To UBound(Arr) + 1, 1 To 20)
  40.   For N = LBound(Arr) To UBound(Arr)
  41.     Tmp = Split(Dict(Arr(N)), vbBack)
  42.     If UBound(Tmp) - LBound(Tmp) > 2 Then
  43.       K = K + 1: Arrt(K, 1) = Mid(Arr(N), 3)
  44.       If UBound(Tmp) > P Then P = UBound(Tmp)
  45.       For I = LBound(Tmp) + 1 To UBound(Tmp) - 1
  46.         If I + 1 > UBound(Arrt, 2) Then ReDim Preserve Arrt(LBound(Arrt) To UBound(Arrt), 1 To UBound(Arrt, 2) + 20)
  47.         Arrt(K, I + 1) = Tmp(I)
  48.       Next I
  49.     End If
  50.   Next N
  51.   Debug.Print "生成结果用时:"; Timer - T: T = Timer
  52.   .Worksheets("result").[f2].Resize(K, P).Value = Arrt
  53.   Debug.Print "写出结果用时:"; Timer - T
  54. End With
  55. Set Dic = Nothing: Set Dict = Nothing
  56. Debug.Print "程序运行用时:"; Timer - mTimer
  57. Debug.Print "结果数量:"; K
  58. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-10-10 14:15 | 显示全部楼层
kevinchengcw 发表于 2024-10-10 12:54
一个一直有推进的商业化语言对比30年前的单线程古早语言,没有10倍以上的速度优势不要拿出来丢人,而且我那 ...

可能你思维太僵化,以为什么都要到Excel中去,其实0.05秒 已经是全过程的时间了,并且参照上面的 0.03秒的基础时间,处理几万条数据只剩下0.02秒了,相对于你的0.326秒,是不是至少快了十几倍,这样的解释你满意了吗? 绝对达到了你的 快十倍以上的诉求
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-1 10:27 , Processed in 0.045430 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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