← back to Professional Directory
scripts/stats.js
69 lines
#!/usr/bin/env node
/**
* Quick console stats — run any time to see what's in the DB.
* node scripts/stats.js
*/
const { pool, query } = require('../agents/shared/db');
async function main() {
const counts = await query(`
SELECT
(SELECT COUNT(*) FROM professionals WHERE opted_out=false) AS professionals,
(SELECT COUNT(*) FROM organizations WHERE opted_out=false) AS organizations,
(SELECT COUNT(*) FROM organizations WHERE type='hospital' AND opted_out=false) AS hospitals,
(SELECT COUNT(*) FROM organizations WHERE type='medical_group' AND opted_out=false) AS medical_groups,
(SELECT COUNT(*) FROM organizations WHERE type='clinic' AND opted_out=false) AS clinics,
(SELECT COUNT(*) FROM organizations WHERE type='surgery_center' AND opted_out=false) AS surgery_centers,
(SELECT COUNT(*) FROM organizations WHERE type='urgent_care' AND opted_out=false) AS urgent_cares,
(SELECT COUNT(*) FROM organizations WHERE type='fqhc' AND opted_out=false) AS fqhcs,
(SELECT COUNT(*) FROM organizations WHERE lat IS NOT NULL) AS geocoded_orgs,
(SELECT COUNT(*) FROM professionals WHERE license_number IS NOT NULL) AS with_license,
(SELECT COUNT(*) FROM professionals WHERE license_status='Active') AS active_license,
(SELECT COUNT(*) FROM professionals WHERE medical_school IS NOT NULL) AS with_school,
(SELECT COUNT(*) FROM raw_records) AS raw_records,
(SELECT COUNT(*) FROM specialties) AS specialties
`, []);
console.table(counts.rows[0]);
console.log('\nTop specialties:');
const top = await query(`
SELECT s.name, COUNT(*) AS n
FROM professional_specialties ps
JOIN specialties s ON s.id = ps.specialty_id
JOIN professionals p ON p.id = ps.professional_id
WHERE p.opted_out = false
GROUP BY s.name ORDER BY n DESC LIMIT 15
`, []);
console.table(top.rows);
console.log('\nDoctors per top LA-area ZIP:');
const byZip = await query(`
SELECT o.zip, z.city, COUNT(DISTINCT p.id) AS doctors,
COUNT(DISTINCT o.id) FILTER (WHERE o.type='hospital') AS hospitals,
COUNT(DISTINCT o.id) AS orgs
FROM la_zips z
LEFT JOIN organizations o ON o.zip = z.zip AND o.opted_out=false
LEFT JOIN professional_locations pl ON pl.organization_id = o.id
LEFT JOIN professionals p ON p.id = pl.professional_id AND p.opted_out=false
GROUP BY o.zip, z.city
HAVING COUNT(DISTINCT p.id) + COUNT(DISTINCT o.id) > 0
ORDER BY doctors DESC NULLS LAST LIMIT 20
`, []);
console.table(byZip.rows);
console.log('\nBeverly Hills (90210/90211/90212):');
const bh = await query(`
SELECT o.zip, COUNT(DISTINCT o.id) AS orgs,
COUNT(DISTINCT pl.professional_id) AS doctors
FROM organizations o
LEFT JOIN professional_locations pl ON pl.organization_id = o.id
WHERE o.zip IN ('90210','90211','90212') AND o.opted_out=false
GROUP BY o.zip ORDER BY o.zip
`, []);
console.table(bh.rows);
await pool.end();
}
main().catch((e) => { console.error(e); process.exit(1); });