|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Cuando ejecuta psql desde el shell puede controlar tanto la salida estandar como la salida de error. Psql también le ayudará a formatear la salida. A continuación se presentan algunos ejemplos del uso de psql desde el shell. Redirigir la salida de las consultas. psql -c "select * from mytable;" > query.outRedirigir la salida de error al mismo archivo que la salida estándar. psql -c "select * from mytable;" > query.out 2>&1Redirigir la entrada de consultas. psql -c "select * from mytable;" < query.sqlEntrada de consultas en línea. Asegúrese que la marca de término empieza en la primera columna psql << QRY_END update mytable set prod_count = prod_count -1 where prod_id = 117; QRY_ENDArchivo con valores separados por comas. -A elimina el alineamiento. -t elimina los encabezados de tabla y los nombres de columna. psql -At -F ',' -c "select * from mytable;" > query.csvSalida HTML. Más útil si se llama desde un cliente perl o php para una aplicación web. psql -H -c "select * from mytable" Para mayor información sobre la redirección y programación del intérprete de comandos, vea man del intérprete que utilice. Estos ejemplos usan bash pero funcionan en la mayoría de los intérpretes. Para mayor información sobre las capacidades de formateo de psql, vea man psql o la PostgreSQL Reference Guide, en la sección Client Applications.
El calificador DISTINCT a una sentencia SELECT le permite eliminar duplicados de un resultado. Usado en conjunción con una cláusula ORDER BY puede entregarle información interesante acerca de sus datos. Esta definición de tabla será usada como ejemplo. Contiene dos escuelas, tres exámenes en dos temas y seis estudiantes. create table fortysix ( school text, subject text, test integer, student_id integer, score integer ); Dado que todos los registros son únicos (asumiendo que no hay errores en el ingreso de datos), la siguiente sentencia entregará todos esos registros. SELECT DISTINCT school, subject, test, student_id, score FROM fortysix;Esto no es particularmente útil. Sin embargo, si limita la lista de salida puede saber qué escuelas están involucradas, qué temas están involucrados y qué estudiantes están involucrados. =# -- Qué escuelas están involucradas =# select distinct school from fortysix; school -------- Carter Ohlone (2 rows) =# =# -- Qué temas están involucrados =# select distinct subject from fortysix; subject --------- Math Reading (2 rows) =# =# -- Qué estudiantes estuvieron involucrados en cada escuela =# select distinct school, student_id from fortysix; school | student_id --------+------------ Carter | 1024 Carter | 1025 Carter | 1026 Ohlone | 1027 Ohlone | 1029 Ohlone | 1400 (6 rows) Usando DISTINCT ON (), especialmente con una cláusula ORDER BY puede entregar aún más información. Las columnas listadas entre paréntesis indican los valores que deben ser únicos. Para controlar cuales registros son listados, puede ordenar por lo que desee; además debe incluir las columnas DISTINCT en la cláusula ORDER BY. En el primer caso, se ordena descendentemente por puntaje para encontrar el registro con el puntaje más alto. =# -- Quien obtuvo el puntaje más alto en cualquier examen, en =# -- cada tema, en cada escuela. =# select distinct on (school, subject) school, subject, test, student_id, score -# from fortysix -# order by school, subject, score desc; school | subject | test | student_id | score --------+---------+------+------------+------- Carter | Math | 1 | 1026 | 100 Carter | Reading | 1 | 1026 | 100 Ohlone | Math | 3 | 1400 | 97 Ohlone | Reading | 3 | 1400 | 100 (4 rows) =# -- Quien obtuvo el puntaje más alto en cada examen en cada =# -- tema en cada escuela. =# select distinct on (school, subject, test) -# school, subject, test, student_id, score -# from fortysix -# order by school, subject, test, score desc; school | subject | test | student_id | score --------+---------+------+------------+------- Carter | Math | 1 | 1026 | 100 Carter | Math | 2 | 1026 | 99 Carter | Math | 3 | 1026 | 100 Carter | Reading | 1 | 1026 | 100 Carter | Reading | 2 | 1026 | 100 Carter | Reading | 3 | 1026 | 99 Ohlone | Math | 1 | 1027 | 92 Ohlone | Math | 2 | 1400 | 95 Ohlone | Math | 3 | 1400 | 97 Ohlone | Reading | 1 | 1027 | 99 Ohlone | Reading | 2 | 1400 | 97 Ohlone | Reading | 3 | 1400 | 100 (12 rows) =# -- Qué estudiante obtuvo el puntaje más alto de todos los exámenes =# -- en cada tema =# select distinct on (subject) school, subject, student_id, score -# from fortysix -# order by subject, score desc; school | subject | student_id | score --------+---------+------------+------- Carter | Math | 1026 | 100 Carter | Reading | 1026 | 100 (2 rows)En el tercer ejemplo, sólo un estudiante fue seleccionado para cada tema, aunque más de uno puede haber obtenido el puntaje máximo. DISTINCT ON () puede ser usado de manera similar a una cláusula GROUP BY, pero no se requiere una función de agregación. Note que debe incluir las columnas que aparecen en DISTINCT nuevamente en la lista de resultados si desea que aparezcan en la salida. Note además que no hay una coma (,) que separe la cláusula DISTINCT de la lista de resultados. Ponga mucho atención a las sentencias en lenguaje natural que describen las consultas; ellas indican cómo construirlas. En la segunda consulta, la pregunta es: ¿Quién obtuvo el más alto puntaje en cada puntaje en cada tema en cada escuela?El superlativo más alto (o más bajo) indica cuál columna ordenar, y en qué dirección. La palabra cada indica la agrupación. En castellano, cada examen en cada tema en cada escuela comúnmente corresponde a la agrupación en el orden inverso: escuela, tema, examen. En inglés sucede lo mismo. =# select distinct on (school, subject, test) -# school, subject, test, student_id, score -# from fortysix -# order by school, subject, test, score desc;
Por razones estadísticas, puede desear muestrear un conjunto de datos en lugar de calcular los resultados usando el conjunto completo. Por ejemplo, puede desear usar uno de cada cinco registros. Puede hacer esto usando una secuencia temporal. Cree las secuencias temporales y seleccione el siguiente valor para cada registro de la consulta. Haga esto en una subconsulta, y en el filtro principal, escoja usando el valor de la secuencia módulo 5. CREATE TEMP SEQUENCE number; SELECT * FROM ( SELECT *, nextval('number') AS number FROM datatable ) foo WHERE foo.number % 5 = 0; Si desea cada quinto valor de una secuencia ordenada, simplemente ordene usando la columna apropiada.
Las diferencias entre las funciones de la hora de reloj y la hora de la transacción fueron cubiertas anteriormente en la edición #16. La pregunta resurge de vez en cuando, de modo que aquí se presenta una mayor explicación en términos de sentencias y transacciones. Las funciones de marcas temporales en PostgreSQL son: Es decir, si desea la hora de reloj, use timeofday(). Si el tiempo de inicio de transacción es adecuado, úselo, porque es algunos microsegundos más rápido. Todas estas funciones retornan el momento en que la transacción en curso comenzó como timestamp, time o date, excepto timeofday(), la cual retorna la hora actual como un campo de texto. Para hacer que timeofday() retorne un timestamp o date, aplíquele una conversión a timestamp o date. Para que retorne un dato de tipo time, aplíquele una conversión a timestamp y luego a time.
Si tiene una de las funciones de tiempo en una cláusula DEFAULT para alguna columna, la hora se pondrá usando el momento de inicio de la transacción del INSERT. Cuando se use estas funciones en un bloque de transacción, las referencias a todas ellas tendrán el mismo valor. Esto es muy útil cuando se trata de sincronizar horas en un conjunto de registros. En particular, un trigger es parte de la transacción de la sentencia SQL que lo invoca, por lo que cualquier referencia a una función de tiempo de transacción tendrá el mismo valor que cualquier otra parte en la sentencia original.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comments and Corrections are welcome. Suggestions and contributions of items are also welcome. Send them in!. Copyright A. Elein Mustain 2003, 2004,2005 |