Public/Get-ShellPhishShowsByState.ps1

function Get-ShellPhishShowsByState {
    <#
    .SYNOPSIS
        Geographic breakdown of Phish shows by state/country.
    .PARAMETER ExportPath
        Optional file path (.csv or .json) to export results.
    .EXAMPLE
        PS C:\> Get-ShellPhishShowsByState
    #>

    [CmdletBinding()]
    param (
        [Parameter()]
        [string]$ExportPath
    )

    Write-Verbose "Fetching all Phish shows..."
    $shows = (Get-ShellPhishShows -Artist phish).data

    if (-not $shows) {
        Write-Warning "No shows found"
        return
    }

    $byState = $shows | Group-Object -Property state | ForEach-Object {
        $venues = ($_.Group | Select-Object -ExpandProperty venue -Unique).Count
        $first  = ($_.Group | Sort-Object showdate | Select-Object -First 1).showdate
        $last   = ($_.Group | Sort-Object showdate | Select-Object -Last 1).showdate
        [PSCustomObject]@{
            State       = $_.Name
            ShowCount   = $_.Count
            UniqueVenues = $venues
            FirstShow   = $first
            LastShow    = $last
        }
    } | Sort-Object ShowCount -Descending

    Export-ShellPhishData -Data $byState -ExportPath $ExportPath
}