sql-cli 1.69.3

SQL query tool for CSV/JSON with both interactive TUI and non-interactive CLI modes - perfect for exploration and automation
Documentation
# Incremental Features Implementation Status

## ✅ Completed Features

### 1. GROUP BY with Aggregates
- **Status**: COMPLETE
- **Implementation**: DataView-based grouping with aggregate function support
- **Supported Aggregates**: COUNT(*), COUNT(col), SUM, AVG, MIN, MAX
- **Test Coverage**: 12 Python tests in test_group_by.py

### 2. HAVING Clause
- **Status**: COMPLETE  
- **Implementation**: Post-aggregation filtering on grouped results
- **Features**:
  - Works with all aggregate functions
  - Supports arithmetic expressions (e.g., `HAVING total_fee > total * 0.04`)
  - Can be combined with WHERE for pre-aggregation filtering
  - Requires GROUP BY (SQL standard compliance)
- **Test Coverage**: 13 Python tests in test_having_clause.py
- **Example**:
  ```sql
  SELECT trader, COUNT(*) as count, SUM(quantity) as total
  FROM trades
  GROUP BY trader
  HAVING count > 5 AND total > 1000
  ```

## 🚧 Next Steps (In Priority Order)

### 1. Simple Window Functions (LAG/LEAD)
**Why Next**: Builds on DataView architecture, only needs adjacent row access

**Design Approach**:
- Add window function expressions to SelectItem enum
- Create sorted DataView based on ORDER BY
- Access adjacent rows using offset calculations
- Return as computed columns

**Example**:
```sql
SELECT 
    price,
    LAG(price, 1) OVER (ORDER BY trade_time) as prev_price,
    price - LAG(price, 1) OVER (ORDER BY trade_time) as price_change
FROM trades
```

### 2. ROW_NUMBER()
**Why Manageable**: Natural extension of LAG/LEAD, just position tracking

**Example**:
```sql
SELECT 
    trader,
    price,
    ROW_NUMBER() OVER (ORDER BY price DESC) as price_rank
FROM trades
```

### 3. PARTITION BY with ROW_NUMBER
**Why More Complex**: Requires combining grouping + ordering

**Design Approach**:
- Reuse GROUP BY's group_by() method for partitioning
- Apply ROW_NUMBER within each partition
- Merge results back

**Example**:
```sql
SELECT 
    trader,
    book,
    price,
    ROW_NUMBER() OVER (PARTITION BY trader ORDER BY price DESC) as rank_within_trader
FROM trades
```

## 📋 Backlog Features

### Advanced Window Functions
- RANK(), DENSE_RANK(), PERCENT_RANK()
- Moving aggregates (SUM/AVG OVER with frame specs)
- FIRST_VALUE(), LAST_VALUE()
- NTILE()

### SQL Enhancements
- Alias support in WHERE clause (requires pre-computation)
- DISTINCT keyword
- Subqueries (complex architecture change)
- CTEs (WITH clause)

## 💡 Key Design Principles

1. **Incremental Approach**: Each feature builds on previous work
2. **DataView-Centric**: Leverage DataView for lightweight data manipulation
3. **No Major Refactoring**: Work within current architecture
4. **Test-Driven**: Comprehensive test coverage for each feature
5. **User Value First**: Focus on commonly needed features

## 🎯 Success Metrics

- ✅ GROUP BY: Enables data aggregation and summarization
- ✅ HAVING: Allows filtering on aggregate results
- 🔜 LAG/LEAD: Enables time-series analysis and comparisons
- 🔜 ROW_NUMBER: Provides ranking and top-N queries
- 🔜 PARTITION BY: Allows windowed calculations within groups

## Notes

- HAVING implementation currently requires using aliases for aggregate functions (e.g., `COUNT(*) as count` then `HAVING count > 5`)
- Complex boolean expressions in HAVING (AND/OR) work but may have limitations
- BETWEEN operator in HAVING not yet supported (use `>= AND <=` instead)