Hellmuth: On Tue, May 14, 2019 at 5:51 PM Hellmuth Vargas <hiv...@gmail.com> wrote: > Disculpe si no fui muy claro: tenemos una tabla con miles de registros y > entre las comunas esta el día de la semana (lunes, martes miércoles....). > Requerimos obtener una muestra aleatoria de los registros de la tabla (el > porcentaje puede variar) donde se garantice que siempre este al menos una vez > cada día de la semana, no indican que sea distribución uniforme de los > mismos, solo que estén presentes todos en la muestra y esto debe generarse > con SQL (ni siquiera PL/pgSQL). en el caso extremo que saquen 7 registros > de muestra, deberían estar los 7 días de la semana representados.
Buff, lo de solo sql es puñetero ( porque te puede obligar a hacer queries gigantes ). Query unico o puedes usar varios? Cuando dices miles, son miles y no decenas de miles ( es decir, tabla pequeña, o que se pueda reducir a una pequeña ). Por otro lado dices "el porcentaje puede variar", eso quiere decir que, p.e., te dicen "el 5% de los registros" y tiene que salir el 5% exacto o que cuando te dicen el 5% te vale con hacer ( dejando el tema del dia de la semana aparte ) "select * where random < 5/100" ( esa condicion, matematicamente, te da entre 0 y todos los registros, pero lo normal es que se aproxime mucho al 5 % ). La verdad, lo que tu quieres hay es mas o menos lo que decia, seleccionar un registro aleatorio por cada dia de la semana mas N-7 aleatorios del resto, con una cascada de queries lo sacas facil, puedes hacer, p.e. si tienes una PK, cosas como 7 subselects de 1 registro aleatorio de cada dia de la semana, mas un subselect de N-7 registros aleatorios con un "not-in" el resultado anterior, pero puede eternizarsete. Si los numeros no tienen que ser exactos ( es decir, tienes 2000 registros, te piden un 5%, que son 100, pero pueden aceptar 106, puedes seleccionar 100 aleatorios, pegar un count de los dias de la semana y añadir hasta 6 mas aleatorios de los dias que falten, pero solo en sql es complicado). Ademas, no sabiendo CUANTOS hay de cada dia de la semana es aun mas dificil sacarlo (p.e., en ese caso, puedes pedir 15 de lunes y martes y 14 del resto de los dias de la semana, pero si la tabla solo tiene ( imagino que no ) 5 registros de luneas a viernes te quedas corto en 10*2+9*3 = 47 registros ). De hay que te diga que un buen muestro es complicado. A mi me han dado definiciones asi de malas, y cuando les he puesto deberes ( sacando cosas como eso de hay arriba, p.e. ), me han aceptado la solucion alternativa de "vale, pues cuando te pida x% del total me puedes dar x/7% de cada dia. Y lo de "solo sql", que te pueden ademas liar con "solo un query", es fino de narices, sobre todo porque ya de cara como hablas de "un porcentage" tienes que empezar por un "select count(*)" para saber cuantos sacar, y aun asi creo que no lo puedes empotrar en un limit, aunque es posible que con un uso creativo de windows o samples lo puedas hacer ( eso es otra parte de la especificacion que te digo, si te dicen la cardinalidad de la muestra, dame 100, es mucho mas facil contruir una solucion en sql que si te dicen "dame el 5%" ). Francisco Olarte.