Column Explorer

One card per column, each with a chart you can click to filter. This page walks through the three card types on the ecommerce sample, with the real numbers.

Opening a card

Hover a column header in the grid and click the small Explore & filter icon. The card opens in a strip above the grid, 260 by 270 pixels, and stays there until you close it. Open as many as you like; the strip scrolls sideways and has a collapse toggle so you can tuck the cards away without losing them. Every card recomputes when a filter or pipeline step changes the rows underneath.

The examples use ecommerce.csv from the templates: 170 orders, loaded as the table ecommerce.

Text columns: a bar per value

Open status. The card runs a GROUP BY and draws one bar per distinct value, most frequent first, with the count beside it:

valuecount
delivered38
cancelled37
returned35
shipped34
placed26

Booleans get the same card, true and false as two bars. A column with hundreds of values loads a page at a time as you scroll, with a N unique values line so you know how many there are in all; the Search values... box narrows the list. This is where I find the cleaning work: USA, usa and United States sitting on three separate bars is a Find & Replace job before anything else.

Click a bar to select it, shift-click for a run of bars, ctrl-click (cmd on a Mac) to pick several, then press the Apply filter icon that appears on the card. Double-click a bar to filter on it straight away. Either way the grid shrinks to the matching rows and the card shows the filter with a clear button.

Number columns: a histogram and five figures

Open total. The card first asks DuckDB for the summary, then bins the values:

SELECT MIN("total"), MAX("total"), AVG("total"), SUM("total"), STDDEV("total"),
       COUNT(*) FILTER (WHERE "total" IS NULL) FROM "ecommerce"
StatValue for totalWhat it tells you
Sum57,311.92Every order added up. For a money column this is the headline number.
Avg337.13Sum divided by the 170 non-empty rows. Skewed by a few large orders, so read it with Min and Max.
StDev176.77Sample standard deviation. Roughly two thirds of orders sit within 176.77 of the average, between about 160 and 514.
Min20.36The smallest order. A zero or a negative here usually means a refund row or a bad export.
Max635.82The largest order. If this were 63,582 I would go looking for a missing decimal point.
Nullsnot shownOnly appears when the column has empty cells. This one has none.

Below the figures is the histogram. The card picks a bar width to give a readable number of bars, and the bin-width control lets you change it. At a width of 100 the orders bucket like this:

rangeorders
0 to 10019
100 to 20027
200 to 30032
300 to 40023
400 to 50031
500 to 60025
600 to 70013

A flat spread like that is unusual in real sales data, which normally piles up at the low end with a long right tail. Whole-number columns such as items (1 to 7) get whole-number bins. Double-click a bar to filter to that range. To take a wider range, click one bar, shift-click another or drag across several, then press Apply filter.

Date columns: rows over time

Open order_date. The card groups by date_trunc('month', "order_date") to begin with and draws a bar per period:

monthorders
Jan 2415
Feb 2415
Mar 2416
Apr 24 to Oct 2416 or 17 each
Nov 2411

The buttons on the card switch the grain between day, week, month, quarter and year. At quarter the same column reads Q1 46, Q2 48, Q3 49, Q4 27, and the short Q4 is the first thing I would ask about: the file ends on 21 November. Double-click a bar to filter to that period, or select a run of bars with shift-click and press Apply filter for a range.

Filters stack

Filters from different cards combine with AND. Filter status to delivered, then country to Brazil, and the grid holds the 14 delivered Brazilian orders; the total card now sums 4,777.36. Each card clears its own filter. A card filter is not a pipeline step, so it does not travel with the exported SQL. When I want a filter to stick, I rebuild it as a Filter step.

Open ecommerce.csv and click the status bars →