Graham-
Interesting problem, no?
Actually, 25 / 4 = 6 with 1 remainder. I would expect three groups of 6 and one group of 7. I think it would actually work if the code calculated the count divided by number of groups as a floating point and then rounded. That would result in either one short or one long group at the end, but the short group would be at least half the size of the other groups (no odd 1 left over) or no larger than half again as much as the other groups.
25 / 4 = 6, 6, 6, 7
26 / 4 = 6, 6, 6, 8
27 / 4 = 7, 7, 7, 6
28 / 4 = 7, 7, 7, 7
etc.
The trick is to modify your code to do a different calculation for the group size and to include everything remaining the the last group.
John Viescas, Author
Effective SQL
SQL Queries for Mere Mortals
Microsoft Access 2010 Inside Out
Microsoft Access 2007 Inside Out
Microsoft Access 2003 Inside Out
Building Microsoft Access Applications
(Paris, France)
On Mar 3, 2017, at 11:48 PM, graham@mandeno.com [MS_Access_Professionals] <MS_Access_Professionals@yahoogroups.com> wrote:
Hi Russ,
Wow! I hope tomorrow turns out a whole lot better for you!
I think there is a problem with dividing the number of records by 4 and using a SELECT TOP N query, because, unless the number of records is a multiple of 4 you will end up with the last group being unbalanced.
For example, is you have 25 records, your quotient will be 7 (otherwise the 25th record will be unassigned). This will give you groups of 7, 7, 7 and 4, when presumably it would be better to have 7, 6, 6 and 6.
Also, I would prefer a solution that avoids a temporary table if possible.
Given this, here is a solution using VBA and DAO:
Const cNumGroups = 4
Dim db as DAO.Database
Dim rs as DAO.Recordset
Dim iCount as Long
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT [Group Number] FROM [Your Table] " _
& "ORDER BY Rnd([House Number]);", dbOpenDynaset)
With rs
Do Until .EOF
![Group Number] = (iCount Mod cNumGroups) + 1
.MoveNext
iCount = iCount + 1
Loop
.Close
End With
Set rs = Nothing
Set db = Nothing
Please note that this is "air code" (neither tested nor compiled) so it may contain typos and other errors :)
Best regards,
Graham
---In MS_Access_Professionals@yahoogroups.com, <dyspoz2@...> wrote :
---In MS_Access_Professionals@yahoogroups.com, <dyspoz2@...> wrote :
Errr, make that two flats. Ugh.
Sent from my iPhone 6s
Sent from my iPhone 6s
On Mar 3, 2017, at 11:07 AM, John Viescas JohnV@... [MS_Access_Professionals] <MS_Access_Professionals@yahoogroups.com> wrote:
John Viescas, AuthorEffective SQLSQL Queries for Mere MortalsMicrosoft Access 2010 Inside OutMicrosoft Access 2007 Inside OutMicrosoft Access 2003 Inside OutBuilding Microsoft Access Applications(Paris, France)
On Mar 3, 2017, at 5:56 PM, Russ dyspoz2@... [MS_Access_Professionals] <MS_Access_Professionals@yahoogroups.com> wrote:
Ah, it just occurred to me that you need to be sure to put "1" in all the inserted records. So, you need to do:
INSERT INTO Group1 ([House Number], [Group Number], <all the rest of the field names>)(SELECT TOP nn [House Number], 1, <all the rest of the field names>FROM MyTableORDER BY [Group Number], [House Number]);
You can actually do subsequent inserts into the same new table (not four separate tables) to avoid having to do a UNION of them all in the end. Just make sure you use the correct literal for Group Number on each new insert.
John Viescas, AuthorEffective SQLSQL Queries for Mere MortalsMicrosoft Access 2010 Inside OutMicrosoft Access 2007 Inside OutMicrosoft Access 2003 Inside OutBuilding Microsoft Access Applications(Paris, France)
On Mar 3, 2017, at 2:53 PM, John Viescas <johnv@...> wrote:
Russ-
Yes, that would be a surer way to ensure you get four equal groups. On the first pass, I would assign numbers 1-4 and start with the "1" records and then pick "2" records until you get to ¼ of the total. That way, you get enough records even if enough weren't assigned "1".
Do the UPDATE as Graham suggested and then do:
INSERT INTO Group1(SELECT TOP nn FROM MyTableORDER BY [Group Number], [House Number]);
.. where nn is one-fourth of the total.
Then to do the DELETE:
DELETE * FROM MyTableWHERE [House Number] IN(SELECT [House Number] FROM [Group1]);
John Viescas, AuthorEffective SQLSQL Queries for Mere MortalsMicrosoft Access 2010 Inside OutMicrosoft Access 2007 Inside OutMicrosoft Access 2003 Inside OutBuilding Microsoft Access Applications(Paris, France)
On Mar 3, 2017, at 1:57 PM, Russ dyspoz2@... [MS_Access_Professionals] <MS_Access_Professionals@yahoogroups.com> wrote:
---In MS_Access_Professionals@yahoogroups.com, <dyspoz2@...> wrote :
John,
Should I put this in the query field where I want the random number applied? Such as in the Group Number field? And I do want the groups to be numbered 1-4 so would the statement be modified like this?
Group: (Rnd([Household Number]) * 4) Mod 5
Russ
You can use the Rnd function to do what you want in a query.
Group: (Rnd([Household Number]) * 4) Mod 4
That will give you a random number between 0 and 3 to assign your groups. Add 1 if you want groups 1 through 4. Use that in an UPDATE query to assign the values.
NOTE: You WILL get random numbers, but there's no guarantee that an equal number of households will be assigned to each group.
John Viescas, Author
__._,_.___
Posted by: John Viescas <johnv@msn.com>
Reply via web post | • | Reply to sender | • | Reply to group | • | Start a New Topic | • | Messages in this topic (15) |
Have you tried the highest rated email app?
With 4.5 stars in iTunes, the Yahoo Mail app is the highest rated email app on the market. What are you waiting for? Now you can access all your inboxes (Gmail, Outlook, AOL and more) in one place. Never delete an email again with 1000GB of free cloud storage.
.
__,_._,___
Tidak ada komentar:
Posting Komentar