Re: registros aleatorios con al menos de una categoría

From: Francisco Olarte <folarte(at)peoplecall(dot)com>
To: Hellmuth Vargas <hivs77(at)gmail(dot)com>
Cc: Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: registros aleatorios con al menos de una categoría
Date: 2019-05-14 17:09:17
Message-ID: CA+bJJbzN7DoDxebW5QqJrjpk1=62rBTos3sOL0f2S+zRVbEVkQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hellmuth:

On Tue, May 14, 2019 at 5:51 PM Hellmuth Vargas <hivs77(at)gmail(dot)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.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Eduardo Arenas 2019-05-14 18:19:52 Re: registros aleatorios con al menos de una categoría
Previous Message Eduardo Arenas 2019-05-14 16:10:54 Re: registros aleatorios con al menos de una categoría