返回列表 上一主題 發帖

分組前三名語法

回復 2# stillfish00

感謝大大提供的方法,這樣的串接法,在小筆數時,應該還行,如果是30萬x30萬這樣串就不太好!

目前是利用sql讀出30萬筆,用vba以迴圈的方式,如果是前三名的就保留,從30萬筆中找出來放進excel中,這樣不用幾秒

只是個人迴圈方式寫的不漂亮…
目前看來在資料庫中有分組後取排名值功能的
oracle
sql server
postgresql
本來想轉過去用,不過postgresql連接vba
我還不行
所以目前還先這樣用

TOP

回復 1# joey0415

試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim AR(), E As Variant, Rng As Range
  4.     With Sheets("Sheet1")
  5.         .Range("A1").CurrentRegion.Sort Key1:=.Range("B2"), Order1:=xlAscending, Key2:=.Range( _
  6.         "A2"), Order2:=xlAscending, Key3:=.Range("D2"), Order3:=xlDescending, Header:=xlYes
  7.         '.Range("A1").CurrentRegion.Sort"資料的排序
  8.         .UsedRange.Columns(2).AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True
  9.         'UsedRange.Columns(2)的進階篩選->  不重複的股票
  10.         
  11.         '**三十萬筆資料 這兩行會慢一點
  12.         
  13.         AR = Application.Transpose(.Cells(1, .Columns.Count).CurrentRegion.Offset(1))
  14.         '取得股票置入一維陣列中
  15.         ReDim Preserve AR(1 To UBound(AR) - 1)          '刪除最後一筆的(空白)資料
  16.         .Cells(1, .Columns.Count).CurrentRegion.Clear   '清除
  17.         .Range("F1").CurrentRegion.Offset(1).Clear      '清除顯示前三筆資料的區域
  18.         For Each E In AR
  19.             Set Rng = .Range("B:B").Find(E, LookAT:=xlWhole)  '找每一股票的第一個位置
  20.             .Range(.Cells(Rng.Row, "A"), .Cells(Rng.Row + 2, "D")).Copy .Cells(.Rows.Count, "F").End(xlUp).Offset(1)
  21.         Next
  22.     End With
  23. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 1# joey0415
sql分組語法,試看看
  1. SELECT a.日期,a.股票,a.券商,a.數量, COUNT(*) AS 排名
  2. FROM 資料表 as a
  3. INNER JOIN 資料表 as b
  4. ON (a.股票=b.股票) AND (a.數量<=b.數量)
  5. GROUP BY a.日期,a.股票,a.券商,a.數量
  6. HAVING COUNT(*) <=3
  7. ORDER BY a.股票,COUNT(*)
複製代碼
不過三十萬筆.....,我不知這樣的語法效率是不是足夠 = =

TOP

        靜思自在 : 真正的愛心,是照顧好自己的這顆心。
返回列表 上一主題