Consultas personalizadas de WSPRnet

Para consultar la base de datos (B.D) de WSPRnet se necesita tener unas nociones básicas del lenguaje SQL, que es un estándar de manejo de BB.DD relacionales, y conocer la estructura de la misma.

Una B.D. se compone básicamente de tablas que tienen columnas o campos y filas o registros

Una web que facilita las consultas mediante QSL a WSPRnet es https://wspr.rocks/ 

La base de datos WSPRnetse llama "wspr.live", y la tabla donde se encuentran los spots recibidos "wspr.rx" , por lo que las consultas que se hacen con el comando "SELECT" deberán incluir la clausula "FROM wspr.rx"


ESTRUCTURA DE LA TABLA WSPR.RX

Los nombres de las columnas de la tabla wspr-rx son los siguientes ( muchos son evidentes): 

  • id: identificador único del registro.
  • time: fecha y hora de la recepción ("spot") en formato YYY-MM-DD HH:MM:SS.
  • band: banda de frecuencias usada (  -1:LF,  0:MF,  1:160m,  3:80m,  5:60m,  7:40m,  10:30m,  14:20m,  18:17m,  21:15m,  24:12m,  28:10m,  50:6m,  70:4m,  144:2m,  432:70cm,  1296:23cm).
  • rx_sign: indicativo de la estación RX que ha recibido el menaje WSPR.
  • rx_lat: latitud geográfica de la estación RX en formato decimal (GG.DDD según sea N o S - ).
  • rx_lon: longitud geográfica de la estación RX en formato decimal (GG.DDD con signo según sea E o W -).
  • rx_loc: grid o locator  geográfica de la estación RX con 6 posiciones XXNNxx.
  • tx_sign: indicativo de la estación TX que ha emitido el menaje WSPR.
  • tx_lat: latitud geográfica de la estación TX en formato decimal (GG.DDD según sea N o S - ).
  • tx_lon: longitud geográfica de la estación TX en formato decimal (GG.DDD con signo según sea E o W -).
  • tx_loc: grid o locator geográfica de la estación TX con 6 posiciones XXNNxx.
  • distance: distancia entre el TX y el RX en km.
  • azimuth: azimuth del RX visto por el TX expresado en grados
  • rx_azimuth: azimuth del RX visto por el TX expresado en grados
  • frequency: frecuencias concreta usada expresada en Hz.
  • power: potencia del TX expresada dBm (-23dBm=0,2 W)
  • snr: relación señal (s) / ruido(N) expresada en dB, como tienen valor negativo, cuanto menor sea mejor es la relación.
  • drift: deriva
  • version: del receptor
  • code: tipo de protocolo usado  code 1 = mode 2 (WSPR2,FST4W-120),   code 2 = mode 15 (FST4W-900),   code 4 = mode 5 (FST4W-300),   code 8 = mode 30 (FST4W-1800)


CONSULTAS - QUERYS

Para conocer el número de spots recibidos por la red en un día (p.e. 13/6/2025) se hace  "SELECT COUNT(*)" desde las 00h00 del 13/6/2025 a las 00h00 del 14/6/2025 "AND time > '2025-06-13' AND time < '2025-06-14'" de la siguiente forma:

  • SELECT COUNT(*) FROM wspr.rx WHERE time > '2025-06-13' AND time < '2025-06-14';

El número de spots recibidos en un día como el 13/6/2025 fue de 3.562.511

Si son los spots recibidos desde una fecha hasta el momento actual podemos usar la claúsula NOW() y el dia actual como CURDATE()

  • SELECT COUNT(*) FROM wspr.rx WHERE time > '2025-06-13' AND time < NOW();
  • SELECT COUNT(*) FROM wspr.rx WHERE time >= CURDATE() AND time < NOW();

Los spots de ayer mediante dos formulas equivalentes una de forma explicita con las fechas y otra de forma implicita resrandole 1 dia a la fecha actual DATEADD(day, -1, CURDATE()) y la fecha actual CURDATE()

  • SELECT COUNT(*) FROM wspr.rx WHERE time >= '2025-06-23' AND time < '2025-06-24';
  • SELECT COUNT(*) FROM wspr.rx WHERE time >= DATEADD(day, -1, CURDATE()) AND time < CURDATE();

Si se quiere conocer el numero de estaciones TX WSPR de las que se han recibido spots en un día en concreto:

  • SELECT  COUNT(DISTINCT tx_sign) FROM wspr.rx WHERE  time > '2025-06-13' AND time < '2025-06-14' 

El número de estaciones WSPR TX de las cuales se reciben spots  en un día como el 13/6/2025 fue de 5.010, la media es de 711 spots/estación con un máximo de 167.328 de la estación WW0WWV (https://wwvarc.org/)

El número de estaciones RX WSPR se puede obtener con:

  • SELECT  COUNT(DISTINCT rx_sign) FROM wspr.rx WHERE  time > '2025-06-13' AND time < '2025-06-14' 

Si se quiere conocer el numero de spots recibidos de cada estación se puede hacer:

  • SELECT tx_sign, COUNT(*) FROM wspr.rx WHERE  time > '2025-06-13' AND time < '2025-06-14' GROUP BY tx_sign ORDER BY  COUNT(*) DESC;

Como hay mas de 2.000 filas de resultado se genera un fichero descargable.

También podemos preguntar sobre el número de spots que recibe cada WSPR RX

  • SELECT rx_sign, COUNT(*) FROM wspr.rx WHERE  time > '2025-06-13' AND time < '2025-06-14' GROUP BY rx_sign ORDER BY  COUNT(*) DESC;

El número de estaciones WSPR RX que reciben spots  en un día como el 13/6/2025 fue de 1.512, la media es de 2.356spots/estación con un máximo de 44.330.

Hay unas 4 veces más de estaciones WSPR TX que de WSPR RX.



Si queremos conocer el orden que ocupa cada estación hay que incluir una columna "row_number() OVER (ORDER BY COUNT(*) DESC) AS row_num":

  • SELECT  row_number() OVER (ORDER BY COUNT(*) DESC) AS row_num, tx_sign, COUNT(*) AS total FROM wspr.rx WHERE  time > '2025-06-13' AND time < '2025-06-14' GROUP BY tx_sign ORDER BY  COUNT(*) DESC;


Si se quiere conocer cuantas estaciones hay de EA(España)

  • SELECT tx_sign, COUNT(*) FROM wspr.rx WHERE tx_sign LIKE 'EA%' AND time > '2025-06-13' AND time < '2025-06-14' GROUP BY tx_sign ORDER BY COUNT(*) DESC; 

Hay 16 estaciones WSPR TX en EA (España)
Hay distritos sin ninguna estación WSPX TX como EA2, EA4, EA7, EA8 y EA9

  • SELECT rx_sign, COUNT(*) FROM wspr.rx WHERE rx_sign LIKE 'EA%' AND time > '2025-06-13' AND time < '2025-06-14' GROUP BY rx_sign ORDER BY COUNT(*) DESC;
Hay 11 estaciones WSPR RX en  EA (España)
Hay distritos sin ninguna estación WSPX RX como EA2, EA6 y EA9


Se puede limitar únicamente a los recibidos de una determinada estación (p.e. EA5JTT ) mediante "WHERE tx_sign='EA5JTT'" de la siguiente forma

  • SELECT COUNT(*) FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-06-13' AND time < '2025-06-14';


Si se quiere es ver los registros completos (SELECT *) de un intervalo, por ejemplo desde las 03h00 a las 4h00 se puede usar

  • SELECT * FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-06-14 03:00:00' AND time < '2025-06-14 04:00:00';

El listado anterior ordenado por tiempo
  • SELECT * FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-06-22 15:00:00' AND time < '2025-06-22 17:00:00' ORDER BY HOUR(time);
El listado anterior ordenado por tiempo y descartando duplicados
  • SELECT DISTINCT rx_sign FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-06-23 00:00:00' AND time < '2025-06-23 23:59:59' ORDER BY HOUR(time);


El listado de  estaciones receptoras únicas con el numero de spots recibidos cada una
  • SELECT DISTINCT rx_sign,  COUNT(rx_sign) FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-06-23 00:00:00' AND time < '2025-06-23 23:59:59' GROUP BY rx_sign HAVING COUNT(rx_sign) > 1 ORDER BY COUNT(rx_sign)  DESC;


Estaciones receptoras /transmisoras de WSPR en una cuadricula determinada (Con 4 caracteres estan las que transmiten con 4 caracteres y las de que transmiten con 6)
  • SELECT rx_loc, COUNT(*) FROM wspr.rx WHERE rx_loc LIKE 'IM99%' AND time > '2025-06-13' AND time < '2025-06-25' GROUP BY rx_loc ORDER BY COUNT(*) DESC;
  • SELECT tx_loc, COUNT(*) FROM wspr.rx WHERE tx_loc LIKE 'IM99%' AND time > '2025-06-13' AND time < '2025-06-25' GROUP BY tx_loc ORDER BY COUNT(*) DESC;



Si queremos concocer los spots de un dia concreto 23-6-2025 recibidos de dos cuadriculas por ejemplo "IM" e "IN" 
  • SELECT tx_loc, COUNT(*) FROM wspr.rx  WHERE (tx_loc LIKE 'IM%' OR tx_loc LIKE 'IN%') AND time > '2025-06-23'  AND time < '2025-06-24'  GROUP BY tx_loc  ORDER BY COUNT(*) DESC;


Los recibidos en cada cuadricula ordenados por cuadriculas
  • SELECT rx_loc, COUNT(*)  FROM wspr.rx  WHERE (rx_loc LIKE 'IM%' OR rx_loc LIKE 'IN%') AND time > '2025-06-23'  AND time < '2025-06-24'  GROUP BY rx_loc  ORDER BY rx_loc DESC;
Si lo que se quiere son los subtotales por bandas (GROUP BY band) con indicación del valor de la misma entonces tenemos:
  • SELECT band, COUNT(*) FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-05-11' AND time < '2025-06-12' GROUP BY band;
Rapidamente se entiende la popularidad de la banda de 14 MHz (20m)

Si se quieren los subtotales por días
  • SELECT DATE(time), COUNT(*) FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-05-11' AND time < '2025-06-12' GROUP BY DATE(time);



Por horas para el dia 11/5/2025
  • SELECT HOUR(time), COUNT(*) FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-05-11' AND time < '2025-06-12' GROUP BY HOUR(time);

Distribución por horas y bandas de los spots recibidos de EA5JTT en todas las bandas ordenado por horas y bandas
  • SELECT  HOUR(time), band, COUNT(*) FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-05-11' AND time < '2025-06-12' GROUP BY HOUR(time), band ORDER BY HOUR(time), band;

Distribución por horas de los spots recibidos de EA5JTT en la banda de 14 MHz
  • SELECT  HOUR(time),  COUNT(*) FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-05-11' AND time < '2025-06-12' AND band='14' GROUP BY HOUR(time), band ORDER BY HOUR(time), band;



Distribución por horas y bandas
  • SELECT HOUR(time) AS hora, COUNT(CASE WHEN band = '3' THEN 1 END)  AS 80m, COUNT(CASE WHEN band = '7' THEN 1 END)  AS 40m, COUNT(CASE WHEN band = '10' THEN 1 END) AS 30m, COUNT(CASE WHEN band = '14' THEN 1 END) AS 20m, COUNT(CASE WHEN band = '18' THEN 1 END) AS 17m, COUNT(CASE WHEN band = '21' THEN 1 END) AS 15m, COUNT(CASE WHEN band = '24' THEN 1 END) AS 12m, COUNT(CASE WHEN band = '28' THEN 1 END) AS 10m, COUNT(CASE WHEN band <> '99' THEN 1 END) AS TOTAL FROM wspr.rx WHERE tx_sign = 'EA5JTT' AND time > '2025-06-23' AND time <  '2025-06-24' GROUP BY HOUR(time) ORDER BY HOUR(time);


Distribución por minutos en un día. En este ejemplo se observa el patron de emisión coordinado del proyecto International WSPR Project
  • SELECT MINUTE(time) AS Minutos, COUNT(CASE WHEN band = '3' THEN 1 END)  AS 80m, COUNT(CASE WHEN band = '7' THEN 1 END)  AS 40m, COUNT(CASE WHEN band = '10' THEN 1 END) AS 30m, COUNT(CASE WHEN band = '14' THEN 1 END) AS 20m, COUNT(CASE WHEN band = '18' THEN 1 END) AS 17m, COUNT(CASE WHEN band = '21' THEN 1 END) AS 15m, COUNT(CASE WHEN band = '24' THEN 1 END) AS 12m, COUNT(CASE WHEN band = '28' THEN 1 END) AS 10m, COUNT(CASE WHEN band <> '99' THEN 1 END) AS TOTAL FROM wspr.rx WHERE tx_sign = 'EA5JTT' AND time > '2025-06-24 00:00:00' AND time <  '2025-06-25 00:00:00' GROUP BY MINUTE(time) ORDER BY MINUTE(time);


Si se quieren los subtotales por dias y bandas y ordenados
  • SELECT DATE(time), band, COUNT(*) FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-05-11' AND time < '2025-06-12' GROUP BY DATE(time), band ORDER BY DATE(time),band;

Si se quiere conocer los indicativos de las estaciones que han recibido nuestras transmisiones WSPR y el número de mensajes que han recibido y ordenada 
  • SELECT rx_sign, COUNT(rx_sign) FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-05-11' AND time < '2025-06-12' GROUP BY rx_sign ORDER BY COUNT(rx_sign) DESC;

Con subtotales por bandas
  • SELECT rx_sign,band, COUNT(rx_sign) FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-05-11' AND time < '2025-06-12' GROUP BY rx_sign, band  ORDER BY COUNT(rx_sign) DESC;



Se puede obtener un encolumnado con suma por fila 
  • SELECT DATE(time) AS fecha, COUNT(CASE WHEN band = '3' THEN 1 END)  AS band_3, COUNT(CASE WHEN band = '7' THEN 1 END)  AS band_7, COUNT(CASE WHEN band = '10' THEN 1 END) AS band_10, COUNT(CASE WHEN band = '14' THEN 1 END) AS band_14, COUNT(CASE WHEN band = '18' THEN 1 END) AS band_18, COUNT(CASE WHEN band = '21' THEN 1 END) AS band_21, COUNT(CASE WHEN band = '24' THEN 1 END) AS band_24, COUNT(CASE WHEN band = '28' THEN 1 END) AS band_28, COUNT(CASE WHEN band <> '99' THEN 1 END) AS total FROM wspr.rx WHERE tx_sign = 'EA5JTT' AND time >= '2025-05-11' AND time <  '2025-06-12' GROUP BY DATE(time) ORDER BY DATE(time);

y sumar las columnas
  • SELECT  toString(DATE(time)) AS fecha, COUNT(CASE WHEN band = '3'  THEN 1 END)  AS band_3, COUNT(CASE WHEN band = '7'  THEN 1 END)  AS band_7, COUNT(CASE WHEN band = '10' THEN 1 END) AS band_10, COUNT(CASE WHEN band = '14' THEN 1 END) AS band_14, COUNT(CASE WHEN band = '18' THEN 1 END) AS band_18, COUNT(CASE WHEN band = '21' THEN 1 END) AS band_21, COUNT(CASE WHEN band = '24' THEN 1 END) AS band_24, COUNT(CASE WHEN band = '28' THEN 1 END) AS band_28, COUNT(CASE WHEN band <> '99' THEN 1 END) AS total FROM wspr.rx WHERE  tx_sign = 'EA5JTT' AND time >= '2025-05-11' AND time <  '2025-06-12' GROUP BY DATE(time) UNION ALL SELECT  'TOTAL' AS fecha, COUNT(CASE WHEN band = '3'  THEN 1 END),  COUNT(CASE WHEN band = '7'  THEN 1 END), COUNT(CASE WHEN band = '10' THEN 1 END), COUNT(CASE WHEN band = '14' THEN 1 END), COUNT(CASE WHEN band = '18' THEN 1 END), COUNT(CASE WHEN band = '21' THEN 1 END), COUNT(CASE WHEN band = '24' THEN 1 END), COUNT(CASE WHEN band = '28' THEN 1 END), COUNT(CASE WHEN band <> '99' THEN 1 END) FROM wspr.rx WHERE    tx_sign = 'EA5JTT'  AND time >= '2025-05-11'    AND time <  '2025-06-12' ORDER BY   fecha;


Obtener los modelos y versiones de los RX WAPR
  • SELECT version, COUNT(CASE WHEN version <> 'xxx' THEN 1 END)  AS Total FROM wspr.rx WHERE tx_sign='EA5JTT' AND time > '2025-05-11' AND time < '2025-06-12'  GROUP BY version  ORDER BY version DESC;


con suma de total
  • SELECT * FROM (  SELECT  version,  COUNT(*) AS Total FROM wspr.rx WHERE  tx_sign = 'EA5JTT'  AND time > '2025-05-11' AND time < '2025-06-12' AND version <> 'xxx'  GROUP BY version    UNION ALL SELECT 'TOTAL' AS version, COUNT(*) AS Total   FROM wspr.rx   WHERE tx_sign = 'EA5JTT' AND time > '2025-05-11' AND time < '2025-06-12' AND version <> 'xxx') ORDER BY  version = 'TOTAL',  Total DESC;
con porcentaje
  • SELECT * FROM ( SELECT  version,    count(*) AS Total,      round(count(*) / total.total_count * 100, 2) AS Porcentaje   FROM wspr.rx,(  SELECT count(*) AS total_count  FROM wspr.rx      WHERE  tx_sign = 'EA5JTT'   AND time > '2025-05-11'  AND time < '2025-06-12' AND version <> 'xxx' ) AS total  WHERE       tx_sign = 'EA5JTT'  AND time > '2025-05-11'  AND time < '2025-06-12' AND version <> 'xxx' GROUP BY version, total.total_count  UNION ALL  SELECT  'TOTAL' AS version, total_count AS Total, 100 AS Porcentaje  FROM (  SELECT count(*) AS total_count      FROM wspr.rx  WHERE   tx_sign = 'EA5JTT'  AND time > '2025-05-11'       AND time < '2025-06-12' AND version <> 'xxx'    ) ) ORDER BY version = 'TOTAL', Total DESC;


Vamos a hora a obtener las distancias máximas TX-RX para un dia concreto 23-6-2025, por horas y bandas (Recuerde que una gráfica, por ejemplo con EXCEL o una hja de cálculo similar los datos se lven mejor)
  • SELECT HOUR(time) AS hora, MAX(CASE WHEN band = '3' THEN distance END) AS "80m", MAX(CASE WHEN band = '7' THEN distance END) AS "40m", MAX(CASE WHEN band = '10' THEN distance END) AS "30m",  MAX(CASE WHEN band = '14' THEN distance END) AS "20m", MAX(CASE WHEN band = '18' THEN distance END) AS "17m", MAX(CASE WHEN band = '21' THEN distance END) AS "15m", MAX(CASE WHEN band = '24' THEN distance END) AS "12m",  MAX(CASE WHEN band = '28' THEN distance END) AS "10m" FROM  wspr.rx WHERE  tx_sign = 'EA5JTT'  AND time >= '2025-06-23'   AND time < '2025-06-24' GROUP BY  HOUR(time) ORDER BY   HOUR(time);



Esto es solamente una pequeña demostración didáctica de cómo explotar la base de datos de WSPRnet, pero con su imaginación y sabiduría llegará donde se proponga



Comentarios

Entradas populares de este blog

ESP32 LoRa for dummys - Inicio

Receptores DAB/DAB+

Antena exterior logarítmica UHF/VHF : Metronic 425010 - Ia Características