* Create a table with 25000 rows, approximately with your distribution
RAND(-1)
CREATE TABLE MyTable (zip5 I,cWhatEver C(10))
FOR lni = 1 TO 25000
lnRand = RAND()
IF m.lnRand <= 3260 / 25000
INSERT INTO MyTable VALUES (10001,SYS(2015))
ELSE
IF m.lnRand <= (3260 + 2178) / 25000
INSERT INTO MyTable VALUES (10016,SYS(2015))
ELSE
IF m.lnRand <= (3260 + 2178 + 2394) / 25000
INSERT INTO MyTable VALUES (10017,SYS(2015))
ELSE
IF m.lnRand <= (3260 + 2178 + 2394 + 3006) / 25000
INSERT INTO MyTable VALUES (10018,SYS(2015))
ELSE
IF m.lnRand <= (3260 + 2178 + 2394 + 3006 + 2119) / 25000
INSERT INTO MyTable VALUES (10019,SYS(2015))
ELSE
IF m.lnRand <= (3260 + 2178 + 2394 + 3006 + 2119 + 2394) / 25000
INSERT INTO MyTable VALUES (10022,SYS(2015))
ELSE
IF m.lnRand <= (3260 + 2178 + 2394 + 3006 + 2119 + 2394 + 2244) / 25000
INSERT INTO MyTable VALUES (10036,SYS(2015))
ELSE
IF m.lnRand <= (3260 + 2178 + 2394 + 3006 + 2119 + 2394 + 2244 + 2089) / 25000
INSERT INTO MyTable VALUES (33166,SYS(2015))
ELSE
IF m.lnRand <= (3260 + 2178 + 2394 + 3006 + 2119 + 2394 + 2244 + 2089 + 1791) / 25000
INSERT INTO MyTable VALUES (92121,SYS(2015))
ELSE
IF m.lnRand <= (3260 + 2178 + 2394 + 3006 + 2119 + 2394 + 2244 + 2089 + 1791 + 1814) / 25000
INSERT INTO MyTable VALUES (92618,SYS(2015))
ELSE
INSERT INTO MyTable VALUES (92660,SYS(2015))
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
NEXT
* prepare the original data recno() is used as an Id
SELECT * FROM MyTable ORDER BY zip5 INTO CURSOR MyCursor
SELECT RECNO() as nRow,* FROM MyCursor INTO CURSOR MyCursor
* create a cursor containing the desired number of rows
SELECT zip5,COUNT(zip5) as no,MIN(nRow) as minRow,MAX(nRow) as maxrow FROM MyCursor GROUP BY 1 INTO CURSOR MyCountCursor
CREATE CURSOR MyTarget (zip5 I,Count I)
INSERT INTO MyTarget VALUES (10001 , 1304)
INSERT INTO MyTarget VALUES (10016 , 871)
INSERT INTO MyTarget VALUES (10017 , 958)
INSERT INTO MyTarget VALUES (10018 , 1202)
INSERT INTO MyTarget VALUES (10019 , 848)
INSERT INTO MyTarget VALUES (10022 , 958)
INSERT INTO MyTarget VALUES (10036 , 898)
INSERT INTO MyTarget VALUES (33166 , 836)
INSERT INTO MyTarget VALUES (92121 , 716)
INSERT INTO MyTarget VALUES (92618 , 726)
INSERT INTO MyTarget VALUES (92660 , 684)
SELECT MyCountCursor.*,MyTarget.Count FROM MyCountCursor,MyTarget WHERE MyCountCursor.zip5 = MyTarget.zip5 ORDER BY 1 INTO CURSOR MyCountCursor
* create a cursor containing the randomly extracted rows from MyCursor
CREATE CURSOR RandRow (nRow I)
INDEX on nRow TAG nRow
SELECT MyCountCursor
SCAN
FOR lni = 1 TO MyCountCursor.Count
lnNewVal = MyCountCursor.minRow + INT(MyCountCursor.no*RAND())
DO WHILE SEEK(m.lnNewVal,'RandRow')
lnNewVal = MyCountCursor.minRow + INT(MyCountCursor.no*RAND())
ENDDO
INSERT INTO RandRow VALUES (m.lnNewVal)
NEXT
SELECT MyCountCursor
ENDSCAN
* Generate the new table
SELECT MyCursor.Zip5,MyCursor.cWhatEver FROM MyCursor,RandRow WHERE MyCursor.nRow = RandRow.nRow INTO TABLE MyNewTable
* Some tests
*!* SELECT zip5,COUNT(zip5) as no FROM MyNewTable GROUP BY 1
*!* SELECT distinct * FROM mynewtable
* Some additional tests
*!* SELECT MyCursor.* FROM MyCursor,RandRow WHERE MyCursor.nRow = RandRow.nRow INTO CURSOR cResult
*!* SELECT zip5,COUNT(zip5) as no FROM cResult GROUP BY 1