Switch to side-by-side view

--- a
+++ b/docs/reference/cheatsheet.md
@@ -0,0 +1,241 @@
+# ehrQL cheatsheet
+
+## Frames
+
+Patient frames contain one row per patient
+
+```
+patient id date_of_birth sex
+123        1980-01-01    m
+456        1990-06-06    f
+789        2020-01-01    i
+```
+
+Event frames contain many rows per patient
+
+```
+patient_id event_date event_code
+123        2020-04-01 abc
+123        2020-04-02 def
+123        2021-01-01 ghi
+```
+
+## Simple dataset
+
+```python
+from ehrql import create_dataset
+from ehrql.tables.core import patients
+from ehrql.tables.tpp import addresses
+
+dataset = create_dataset()
+...
+dataset.define_population(
+    patients.exists_for_patient()
+)
+```
+
+## Codelists
+
+```python
+statin_medications = codelist_from_csv("codelists/dm_cod.csv", column="code")
+```
+
+## Show
+
+```python
+from ehrql import show
+show(patients)
+```
+
+## Tables
+
+### core
+
+```python
+clinical_events
+medications
+ons_deaths
+patients
+practice_registrations
+```
+
+#### selected values
+
+```python
+clinical_events.date
+clinical_events.snomedct_code
+clinical_events.numeric_value
+patients.date_of_birth
+patients.sex
+patients.date_of_death
+```
+
+### tpp
+
+```python
+addresses
+apcs
+apcs_cost
+appointments
+clinical_events
+clinical_events_ranges
+covid_therapeutics
+ec
+ec_cost
+emergency_care_attendances
+ethnicity_from_sus
+household_memberships_2020
+medications
+occupation_on_covid_vaccine_record
+ons_deaths
+opa
+opa_cost
+opa_diag
+opa_proc
+open_prompt
+parents
+patients
+practice_registrations
+sgss_covid_all_tests
+ukrr
+vaccinations
+wl_clockstops
+wl_openpathways
+```
+
+#### selected values
+
+```python
+addresses.address_id
+addresses.start_date
+addresses.end_date
+addresses.imd_rounded
+apcs.admission_date
+medications.date
+medications.dmd_code
+practice_registration.start_date
+practice_registration.end_date
+practice_registration.practice_pseudo_id
+practice_registration.practice_stp
+ukrr.renal_centre
+vaccinations.date
+vaccinations.product_name
+```
+
+## adding data to a dataset
+
+### from a patient frame
+
+value series
+
+```python
+dataset.sex = patients.sex
+dataset.date_of_birth = patients.date_of_birth
+dataset.birth_year = patients.date_of_birth.year
+dataset.age = patients.age_on("2024-01-01")
+```
+
+boolean series
+
+```python
+dataset.died_with_X = ons_deaths.cause_of_death_is_in(cause_of_death_X_codelist)
+```
+
+### from an event frame
+
+value series
+
+```python
+dataset.imd = addresses.for_patient_on("2023-01-01").imd_rounded
+```
+
+aggregated value series
+
+```python
+dataset.mean_hba1c = clinical_events.where(
+    clinical_events.snomedct_code.is_in(hba1c_codelist)
+).where(
+    clinical_events.date.is_on_or_after("2022-07-01")
+).numeric_value.mean_for_patient()
+```
+
+sorted value series
+
+```python
+dataset.first_statin_prescription_date = medications.where(
+    medications.dmd_code.is_in(statin_medications)
+).sort_by(
+    medications.date
+).first_for_patient().date
+```
+
+boolean series
+
+```python
+dataset.has_had_asthma_diagnosis = clinical_events.where(
+    clinical_events.snomedct_code.is_in(asthma_codelist)
+).exists_for_patient()
+```
+
+boolean series with a date range
+
+```python
+dataset.has_recent_cardiac_admission = apcs.where(
+    apcs.primary_diagnosis.is_in(cardiac_diagnosis_codes)
+).where(
+    apcs.admission_date.is_on_or_between("2022-07-01", "2023-01-01")
+).exists_for_patient()
+```
+
+## logic operators
+
+* `==` equals
+* `!=` not equals
+* `&` and
+* `|` or
+* `~` not
+* `>` greater than
+* `>=` greater than or equals
+* `<=` less than or equals
+* `<` less than
+
+## selected functions
+
+### common
+
+```python
+.is_null()
+.is_not_null()
+.is_in()
+.contains()
+.map_values()
+```
+
+### aggregation
+
+```python
+.minimum_for_patient()
+.maximum_for_patient()
+.sum_for_patient()
+.mean_for_patient()
+.count_for_patient()
+```
+
+### date
+
+```python
+.is_before(other)
+.is_on_or_before(other)
+.is_after(other)
+.is_on_or_after(other)
+.is_between_but_not_on(start, end)
+.is_on_or_between(start, end)
+.is_during(interval)
+```
+
+### sorted event frames
+
+```python
+.first_for_patient()
+.last_for_patient()
+```