Kaup, Chester
Chester_Kaup at kindermorgan.com
Thu May 11 16:13:43 CDT 2006
Against an SQL server table with the wells and the date sorted ascending
461,569 records run time was 23.6094 seconds. Against a native Access
table with the wells sorted ascending and date sorted descending run
time was 11.7656 seconds. The only problem I found was dates did not
sort ascending. I see any reason why. Thanks for the code.
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of A.D.TEJPAL
Sent: Thursday, May 11, 2006 12:52 PM
To: Access Developers discussion and problem solving
Cc: ADT
Subject: Re: [AccessD] Top values query problem
Chester,
Sample subroutine given below should get you exceptionally fast
results. T_Result is the target table to which top 6 results for each
value of PT_Well get appended.
Could you please try it out on your large size data set and confirm
?
A.D.Tejpal
---------------
Code in Click event of command button on Main form
(SF_ResultSub is the name of control on main form
acting as container for the subform fed by table T_Result)
=============================================
Private Sub CmdResult_Click()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim Qst As String, PtWell As String
Qst = "SELECT DISTINCT PT_Well " & _
"FROM dbo_Prod_Tests ORDER BY PT_Well;"
Set db = CurrentDb
Set rst = db.OpenRecordset(Qst)
' Clear table T_Result
Qst = "Delete * From T_Result;"
db.Execute Qst, dbFailOnError
Do While Not rst.EOF
' Append Top 6 records pertaining to current value
' of PT_Wells, from main table into T_Result
PtWell = rst.Fields("PT_Well")
Qst = "INSERT INTO T_Result " & _
"(PT_Well, PT_Date, PT_Status) " & _
"SELECT Q1.PT_Well, Q1.PT_Date, " & _
"Q1.PT_Status FROM [SELECT TOP 6 " & _
"PT_Well, PT_Date, PT_Status " & _
"FROM dbo_Prod_Tests " & _
"WHERE PT_Well = '" & PtWell & "' " & _
"ORDER BY PT_Well, PT_Date DESC]. AS Q1;"
db.Execute Qst, dbFailOnError
rst.MoveNext
Loop
Me.SF_ResultSub.Requery
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
=============================================
----- Original Message -----
From: Kaup, Chester
To: Access Developers discussion and problem solving
Sent: Thursday, May 11, 2006 17:41
Subject: Re: [AccessD] Top values query problem
Thanks. That is what I am going to do.
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Gustav
Brock
Sent: Thursday, May 11, 2006 6:07 AM
To: accessd at databaseadvisors.com
Subject: Re: [AccessD] Top values query problem
Hi Chester
You could sort on Well and Date in a recordset you open in VBA.
Then loop through this writing the first six records for each Well to
a
new (temp) table.
That should run pretty fast.
/gustav
>>> Chester_Kaup at kindermorgan.com 10-05-2006 23:28 >>>
Got around to trying this and had to make 2 changes. PT_Well and
PT_Status were already strings so I removed the Str function. Query
runs
fine for a few records. The table I am working against has ~500,000
records. I gave up letting it run it was taking so long. Am I missing
something or is there a better way to do this such as VBA? My query
SELECT
PT_Well,
PT_Date,
PT_Status
FROM
dbo_Prod_Tests
WHERE
PT_Well & "x" & Str(PT_Date) & "x" & PT_Status IN
(SELECT TOP 6
T.PT_Well & "x" & Str(T.PT_Date) & "x" & T.PT_Status
FROM
dbo_Prod_Tests As T
WHERE
dbo_Prod_Tests.PT_Well = T.PT_Well
ORDER BY
T.PT_Well,
T.PT_Date DESC;)
ORDER BY
PT_Well,
PT_Date DESC;
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Gustav
Brock
Sent: Wednesday, May 10, 2006 4:01 AM
To: accessd at databaseadvisors.com
Subject: Re: [AccessD] Top values query problem
Hi Chester
Something like this where you use a pseudo key if you don't have a
unique key:
SELECT
PT_Well,
PT_Date,
PT_Status
FROM
dbo_Prod_Tests
WHERE
Str(PT_Well) & "x" & Str(PT_Date) & "x" & Str(PT_Status) IN
(SELECT TOP 6
Str(T.PT_Well) & "x" & Str(T.PT_Date) & "x" & Str(T.PT_Status)
FROM
dbo_Prod_Tests As T
WHERE
dbo_Prod_Tests.PT_Well = T.PT_Well
ORDER BY
T.PT_Well,
T.PT_Date DESC;)
ORDER BY
PT_Well,
PT_Date DESC;
This assumes you have only one record for each Well/Date.
/gustav
>>> Chester_Kaup at kindermorgan.com 09-05-2006 23:34 >>>
When I run the following query I get the top 6 values for only the
first
PT_Well which makes sense the way the query grid makes the query. How
do
I change the query to get the top 6 for each PT_Well? Thanks.
SELECT TOP 6 PT_Well, PT_Date, PT_Status
FROM dbo_Prod_Tests
GROUP BY PT_Well, PT_Date, PT_Status
ORDER BY PT_Well, PT_Date DESC;
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com