Your clinic intelligence data is now hosted on Neon PostgreSQL database.
Connection Information:
- Server:
ep-calm-recipe-a8tryfj4-pooler.eastus2.azure.neon.tech - Port:
5432 - Database:
neondb - Username:
neondb_owner - Password:
npg_fcp6hyHUrPS7
Connection String:
postgresql://neondb_owner:npg_fcp6hyHUrPS7@ep-calm-recipe-a8tryfj4-pooler.eastus2.azure.neon.tech:5432/neondb?sslmode=require
Power BI Desktop needs the Npgsql driver:
- Download from: https://github.com/npgsql/npgsql/releases
- Or install via Windows: https://www.postgresql.org/download/windows/
- Open Power BI Desktop
- Click Get Data → More...
- Search for PostgreSQL database
- Click Connect
In the PostgreSQL database window:
Server:
ep-calm-recipe-a8tryfj4-pooler.eastus2.azure.neon.tech
Database:
neondb
Data Connectivity mode:
- Select Import (recommended for best performance)
- Or DirectQuery (for real-time data)
Click OK
- Select Database authentication
- Enter credentials:
- User name:
neondb_owner - Password:
npg_fcp6hyHUrPS7
- User name:
- Click Connect
You'll see all 7 tables:
- ✅ clinics - Main clinic data (123 records)
- ✅ reviews - Customer reviews (191 records)
- ✅ search_trends - Google Trends data (1,512 records)
- ✅ visibility_scores - Calculated scores (114 records)
- ✅ demand_metrics - Market demand analysis (280 records)
- ✅ competitor_analysis - Competition metrics (9 records)
- ✅ data_collection_logs - Collection history (13 records)
Select the tables you need (typically start with clinics, reviews, and demand_metrics)
Click Load or Transform Data (to clean/shape data first)
- Download from: https://www.postgresql.org/ftp/odbc/versions/msi/
- Install the driver (choose 64-bit for most systems)
Windows:
- Open ODBC Data Source Administrator (64-bit)
- Click Add → Select PostgreSQL Unicode
- Configure:
- Data Source:
NeonClinicDB - Server:
ep-calm-recipe-a8tryfj4-pooler.eastus2.azure.neon.tech - Port:
5432 - Database:
neondb - User Name:
neondb_owner - Password:
npg_fcp6hyHUrPS7 - SSL Mode:
require
- Data Source:
- Click Test to verify
- Click Save
- Get Data → ODBC
- Select NeonClinicDB from dropdown
- Click OK
- Select tables and Load
If you want to load custom queries:
- Get Data → PostgreSQL database
- Enter server and database details
- Click Advanced options
- Enter SQL query:
-- Example: Get clinics with combined ratings
SELECT
id,
name,
address,
city,
zip_code,
clinic_type,
google_rating,
yelp_rating,
ROUND((COALESCE(google_rating, 0) + COALESCE(yelp_rating, 0)) / 2, 2) as combined_rating,
(COALESCE(google_review_count, 0) + COALESCE(yelp_review_count, 0)) as total_reviews,
latitude,
longitude
FROM clinics
WHERE is_active = true
ORDER BY combined_rating DESC;Once connected, create these DAX measures:
Combined Rating =
AVERAGEX(
clinics,
(clinics[google_rating] + clinics[yelp_rating]) / 2
)
Total Reviews =
SUM(clinics[google_review_count]) +
SUM(clinics[yelp_review_count])
Clinics by Type =
CALCULATE(
COUNTROWS(clinics),
ALLEXCEPT(clinics, clinics[clinic_type])
)
Opportunity Score =
AVERAGE(demand_metrics[opportunity_score])
- Visual: Map or ArcGIS Map
- Location:
clinics[latitude],clinics[longitude] - Size:
Total Reviews - Color:
Combined Rating
- Visual: Clustered Column Chart
- Axis:
clinics[clinic_type] - Values:
Average of google_rating,Average of yelp_rating
- Visual: Table or Matrix
- Rows:
clinics[zip_code] - Values:
Count of clinics,Combined Rating,Total Reviews
- Visual: Scatter Chart
- X-axis:
demand_metrics[search_demand_index] - Y-axis:
demand_metrics[clinic_count] - Size:
demand_metrics[opportunity_score]
- Visual: Line Chart
- Axis:
reviews[review_date] - Values:
Count of reviews,Average of rating
- Solution: Double-check username and password
- Ensure SSL mode is enabled
- Verify firewall isn't blocking port 5432
- Solution: Check internet connection
- Verify server address is correct
- Try connecting from command line:
psql 'postgresql://neondb_owner:npg_fcp6hyHUrPS7@ep-calm-recipe-a8tryfj4-pooler.eastus2.azure.neon.tech:5432/neondb'
- Solution: Use Import mode instead of DirectQuery
- Create aggregated tables in Power BI
- Add indexes to Neon database (already included)
- Solution: Ensure schema is
public(default) - Refresh metadata in Power BI
- Verify tables exist: Run query in Neon console
To keep Power BI dashboard updated:
-
Power BI Desktop:
- Click Refresh button manually
- Or set auto-refresh in dataset settings
-
Power BI Service (Pro/Premium):
- Publish report to Power BI Service
- Configure scheduled refresh:
- Gateway: Not needed (cloud database)
- Frequency: Daily at 3:00 AM (after data collection)
- Credentials: Store Neon credentials securely
-
Data Collection Schedule:
- Run collectors:
python3 -m src.collectors.google_places_collector - Then
python3 -m src.collectors.yelp_collector - Data updates in Neon automatically
- Power BI refreshes on schedule
- Run collectors:
- Don't share credentials publicly
- Use Row-Level Security (RLS) in Power BI if needed
- Rotate passwords regularly in Neon console
- Monitor query performance in Neon dashboard
- Set up read-only user for Power BI:
-- Create read-only user for Power BI (optional)
CREATE USER powerbi_reader WITH PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE neondb TO powerbi_reader;
GRANT USAGE ON SCHEMA public TO powerbi_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO powerbi_reader;- ✅ Connect Power BI to Neon (follow method 1 above)
- 📊 Create your first dashboard
- 📈 Set up scheduled refresh
- 🎨 Customize visuals and themes
- 📤 Publish to Power BI Service (if available)
Migration Date: 2026-01-10 Database: Neon PostgreSQL Total Records: 2,242 (123 clinics, 191 reviews, 1,512 trends, etc.) Status: ✅ Active and Ready