核心内容摘要
精品天堂网精选优质资源:开启你的数字世界无限可能
SQL 通常分为三大类类å�‹å…¨ç§°ä½œç”¨å¸¸è§�命令DDLData Definition Language定义/修改结æ�„CREATE,ALTER,DROP,TRUNCATEDMLData Manipulation Languageæ“�作数æ�®å†…容SELECT,INSERT,UPDATE,DELETEDCLData Control Languageæ�§åˆ¶è®¿é—®æ�ƒé™�GRANT,REVOKESELECT VERSION();查看MySQLçš„ç‰ˆæœ¬æ ¸å¿ƒæ€�想是给按时间æ�’åº�å��çš„æ¯�一行分é…�一个è¿�ç»åº�å�·ç„¶å��æ¯�隔一定间隔å�–一æ�¡æˆ–按比例å�–ä»�而å®�ç�°â€œæ—¶é—´è½´ä¸Šçš„å�‡åŒ€é‡‡æ ·â€�。✅ æ�¨è��方法使用ROW_NUMBER() 比例过滤MySQL
0✅ �求MySQL
0 或更高版本支�窗�函数 最佳�践 SQL-- 方法1精确抽� 30%�� INSERT INTO target_table (id, user_id, amount, create_time, status) SELECT id, user_id, amount, create_time, status FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY create_time) AS rn, COUNT(*) OVER () AS total_rows FROM source_table WHERE status paid -- �选先过滤 ) t WHERE rn total_rows *
3; ��解释ROW_NUMBER() OVER (ORDER BY create_time)→ 按时间��编�1, 2, 3, ..., NCOUNT(*) OVER ()→ ��总行数Nrn N *
3→ å�–å‰� 30% çš„è¡Œå› ä¸ºå·²æŒ‰æ—¶é—´æ�’åº�å‰� 30% 就是时间最早的 30%â�Œè¿™ä¸�是“å�‡åŒ€â€�âš ï¸� 注æ„�上é�¢è¿™ä¸ªæ–¹æ³•是“å�–å‰�30%â€�ä¸�是“å�‡åŒ€åˆ†å¸ƒâ€�✅ æ£ç¡®å®�ç�°â€œæ—¶é—´å�‡åŒ€åˆ†å¸ƒâ€�的方法è¦�å®�ç�°åœ¨æ•´ä¸ªæ—¶é—´èŒƒå›´å†…å�‡åŒ€æŠ½å�– 30%比如æ¯�10分钟抽3æ�¡è€Œä¸�是å�ªæŠ½å‰�3个月应该用ç‰é—´è·�é‡‡æ ·âœ… 方法2ç‰é—´è·�é‡‡æ ·çœŸæ£å�‡åŒ€-- 真æ£çš„æ—¶é—´å�‡åŒ€é‡‡æ ·æ¯�éš” k 行å�– 1 行使得最终约 30% INSERT INTO target_table (id, user_id, amount, create_time, status) SELECT id, user_id, amount, create_time, status FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY create_time) AS rn FROM source_table WHERE status paid ) t WHERE MOD(rn - 1,
0; -- �3行�1行 ≈
3
3%但
3
3% ≠30%。è¦�精确 30%å�¯è¿™æ ·âœ… 方法3精确 30% å�‡åŒ€é‡‡æ ·æœ€ä¼˜è§£INSERT INTO target_table (id, user_id, amount, create_time, status) SELECT id, user_id, amount, create_time, status FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY create_time) AS rn, COUNT(*) OVER () AS total FROM source_table WHERE status paid ) t WHERE MOD(rn * 100, total) 30;但这较å¤�æ�‚。更简å�•且å®�用的å�šæ³•æ˜¯âœ… 方法4使用NTILE分桶æ�¨è��-- 将数æ�®æŒ‰æ—¶é—´åˆ†æˆ� 10 æ¡¶æ¯�æ¡¶å�– 3 æ¡¶ → 精确 30% INSERT INTO target_table (id, user_id, amount, create_time, status) SELECT id, user_id, amount, create_time, status FROM ( SELECT *, NTILE(
OVER (ORDER BY create_time) AS bucket FROM source_table WHERE status paid ) t WHERE bucket IN (1, 2,
; -- ��3桶 30%✅这是最符�“时间�匀��求的方法NTILE(
把按时间æ�’åº�的数æ�®å�‡åˆ†ä¸º10个è¿�ç»æ—¶é—´æ®µæ¯�个bucket包å�«çº¦ 10% 的数æ�®å�–bucket IN (1,2,
→ 覆盖整个时间范围的å‰�30%时间段â�Œç‰ç‰è¿™è¿˜æ˜¯è¿�ç»æ—¶é—´æ®µä¸�是“å�‡åŒ€åˆ†å¸ƒâ€�。✅ 终æ��æ£ç¡®æ–¹æ¡ˆç³»ç»ŸæŠ½æ ·Systematic Samplingç›®æ ‡åœ¨æ•´ä¸ªæ—¶é—´åº�列ä¸ç‰é—´éš”æŠ½å�–ç¡®ä¿�æ ·æœ¬è¦†ç›–å…¨å¹´ä¸�è�šé›†åœ¨æŸ�一段。✅ 最佳 SQLMySQL
0-- è®¡ç®—é‡‡æ ·æ¥é•¿æ¯� k 行å�– 1 行使得总数 ≈ 30% WITH numbered AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY create_time) AS rn FROM source_table WHERE status paid ), params AS ( SELECT MAX(rn) AS total, CEIL(MAX(rn) / (MAX(rn) *
0.
) AS step -- �际�简化 FROM numbered ) SELECT n.* FROM numbered n CROSS JOIN params p WHERE MOD(n.rn - 1, FLOOR(p.total / (p.total *
0.
)) 0 LIMIT FLOOR((SELECT COUNT(*) FROM source_table WHERE status paid) *
0.
;太å¤�æ�‚了✅ 简æ´�高效方案生产æ�¨è��ç›´æ�¥ç”¨MOD(ROW_NUMBER(), k) 0选择å�ˆé€‚çš„ kå�‡è®¾æ€»è¡Œæ•° ≈ 2,000,000è¦�抽 600,000 æ�¡30%åˆ™é‡‡æ ·é—´éš” k 总行数 / ç›®æ ‡è¡Œæ•° ≈ 2000000 / 600000 ≈
33但MOD�能用整数所以�k 3 或 4为了更精确我们�以动�计算✅ 最终�� SQL简� �匀 高效-- 方案A固定间隔简�有效 INSERT INTO target_table SELECT id, user_id, amount, create_time, status FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY create_time) AS rn FROM source_table WHERE status paid ) t WHERE MOD(rn,
1; -- �3行�1行 →
3
3%æ�¥è¿‘30%如æ�œä¸€å®šè¦�ä¸¥æ ¼ 30%且æ�¥å�—轻微ä¸�å�‡åŒ€å�¯ç”¨âœ… 方案B结å�ˆ LIMIT精确数é‡� å�‡åŒ€èµ·ç‚¹-- 先确定起始å��ç§»å†�ç‰é—´éš”å�– SET total (SELECT COUNT(*) FROM source_table WHERE status paid); SET target FLOOR(total *
0.