🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych.msaccess
Article #137496

Re: Liczenie mediany SQL - przyspieszenie

#137496
From: md
Date: Fri, 18 Aug 2017 07:57
116 lines
3591 bytes
W dniu 18-08-2017 o 09:01, minfo@onet.pl pisze:
> Dzień dobry,
> Czy można jakoś przyspieszyć poniższe funkcje liczenia mediany?
>
>
> Function DMediana(sql, ParamArray args())
>   Dim db As Database
>   Dim qr As QueryDef
>   Dim rs As Recordset
>   Dim pr As Parameter
>
>
>   Dim i As Long, k As Long
>
>
>   Set db = DBEngine(0)(0)
>   Set qr = db.CreateQueryDef("", sql)
>
>
>   For i = 0 To UBound(args)
>     Set pr = qr.Parameters(i)
>     pr.Value = args(i)
>   Next
>
>
>   Set rs = qr.OpenRecordset
>   With rs
>     If Not (.BOF And .EOF) Then
>       .MoveLast
>       k = .RecordCount
>       If k Mod 2 = 1 Then
>         .MoveFirst
>         .Move (k - 1) / 2
>         DMediana = .Fields(0)
>       Else
>         .MoveFirst
>         .Move k / 2 - 1
>         DMediana = .Fields(0)
>         .MoveNext
>         DMediana = (DMediana + .Fields(0)) / 2
>       End If
>
>
>     Else
>       DMediana = Null
>     End If
>   End With
>
>
> End Function
>
>
>
>
> Sub CMEDIA()
> On Error GoTo ErrMsg
>
> Dim strSQLDM As String
> Dim strFile As String
> Dim strFtext As String
> Dim db As Database
> Dim rs As DAO.Recordset
> Dim fs As Object
> Dim csvFMedia As Object
> Dim i As Integer
> Dim v As Variant
>
> Dim sUser As String
> sUser = VBGetUserName()
>
> Set db = CurrentDb
>
> strSQLDM = "SELECT t.PRODUKT, DMEDIANA(""SELECT MM FROM qryMEDIANA WHERE PRODUKT = [p1] ORDER BY MM"", " & _
> "t.PRODUKT ) AS MEDIANA FROM qryMEDIANA AS t GROUP BY t.PRODUKT;"
>
> 'strSQLDM = "SELECT t.PRODUKT, DMEDIANA(""SELECT MM FROM PRECYZJA3 WHERE PRODUKT = [p1] ORDER BY MM"", " & _
> '"t.PRODUKT ) AS MEDIANA FROM PRECYZJA3 AS t GROUP BY t.PRODUKT;"
>
> DoCmd.Hourglass (True)
>
> Set rs = db.OpenRecordset(strSQLDM)
>
> If rs.BOF Or rs.EOF Then
> Exit Sub
> Else
>
>     v = SysCmd(acSysCmdInitMeter, "Generowanie mediany:", rs.RecordCount)
>     i = 1
>
>     rs.MoveFirst
>
>     Do Until rs.EOF
>         v = SysCmd(acSysCmdUpdateMeter, i)
>         i = i + 1
>
>         If strFtext = "" Then
>         strFtext = "Produkt;Mediana"
>         strFtext = strFtext & vbCrLf & "'" & rs.Fields("PRODUKT") & ";" & rs.Fields("MEDIANA")
>         Else
>         strFtext = strFtext & vbCrLf & "'" & rs.Fields("PRODUKT") & ";" & rs.Fields("MEDIANA")
>         End If
>
>         rs.MoveNext
>     Loop
>
>
> pozdrawiam
> MF
>
taka sugestia :
czy nie lepiej napisać kwerendę uprządkowaną rosnąco lub malejąco
policzyć rekordy
wyznaczyć środkowy
pobrać jego wartość

md
Technical Details
Message-ID: <59969dc6$0$647$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <4daf7bbf-74f5-4804-b5ec-a69ac0078248@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Subject: Re: Liczenie mediany SQL - przyspieszenie
Newsgroups: pl.comp.bazy-danych.msaccess
References: <4daf7bbf-74f5-4804-b5ec-a69ac0078248@googlegroups.com>
From: md <bmkd@poczta.onet.pl>
Date: Fri, 18 Aug 2017 09:57:41 +0200
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0
MIME-Version: 1.0
In-Reply-To: <4daf7bbf-74f5-4804-b5ec-a69ac0078248@googlegroups.com>
Lines: 116
Message-ID: <59969dc6$0$647$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 95.48.0.238
X-Trace: 1503043014 unt-rea-b-01.news.neostrada.pl 647 95.48.0.238:53339
X-Complaints-To: abuse@news.neostrada.pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit