From ce56b1b354fab493b12a8ee4a010ea5bc9bd2f0d Mon Sep 17 00:00:00 2001 From: Taksh Date: Fri, 31 Jul 2026 13:16:08 +0300 Subject: [PATCH 1/5] fix(mimic-iv): filter MCHC to g/dL rows in complete_blood_count Itemid 51249 is sometimes recorded with valueuom '%' in labevents. Keep only g/dL values when building the derived MCHC column. Co-authored-by: Cursor --- mimic-iv/concepts/measurement/complete_blood_count.sql | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mimic-iv/concepts/measurement/complete_blood_count.sql b/mimic-iv/concepts/measurement/complete_blood_count.sql index 4e754a1d2..50e3f32a9 100644 --- a/mimic-iv/concepts/measurement/complete_blood_count.sql +++ b/mimic-iv/concepts/measurement/complete_blood_count.sql @@ -8,7 +8,11 @@ SELECT , MAX(CASE WHEN itemid = 51221 THEN valuenum ELSE NULL END) AS hematocrit , MAX(CASE WHEN itemid = 51222 THEN valuenum ELSE NULL END) AS hemoglobin , MAX(CASE WHEN itemid = 51248 THEN valuenum ELSE NULL END) AS mch - , MAX(CASE WHEN itemid = 51249 THEN valuenum ELSE NULL END) AS mchc + , MAX( + CASE + WHEN itemid = 51249 AND valueuom = 'g/dL' THEN valuenum ELSE NULL + END + ) AS mchc , MAX(CASE WHEN itemid = 51250 THEN valuenum ELSE NULL END) AS mcv , MAX(CASE WHEN itemid = 51265 THEN valuenum ELSE NULL END) AS platelet , MAX(CASE WHEN itemid = 51279 THEN valuenum ELSE NULL END) AS rbc @@ -30,6 +34,8 @@ WHERE le.itemid IN , 51301 -- WBC ) AND valuenum IS NOT NULL + -- MCHC (51249) is sometimes recorded with valueuom '%' in error; keep g/dL only + AND (itemid != 51249 OR valueuom = 'g/dL') -- lab values cannot be 0 and cannot be negative AND valuenum > 0 GROUP BY le.specimen_id From 4417494963d8c2df16406f0ac5bf98a2b87fbdef Mon Sep 17 00:00:00 2001 From: Taksh Date: Fri, 31 Jul 2026 13:16:08 +0300 Subject: [PATCH 2/5] fix(mimic-iv): filter CRP to mg/L rows in inflammation concept Itemid 50889 rows with missing valueuom are excluded; mg/L is the expected unit for C-reactive protein in hosp.labevents. Fixes #1922 Co-authored-by: Cursor --- mimic-iv/concepts/measurement/inflammation.sql | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mimic-iv/concepts/measurement/inflammation.sql b/mimic-iv/concepts/measurement/inflammation.sql index c41066db6..1a64d10a4 100644 --- a/mimic-iv/concepts/measurement/inflammation.sql +++ b/mimic-iv/concepts/measurement/inflammation.sql @@ -4,7 +4,11 @@ SELECT , MAX(charttime) AS charttime , le.specimen_id -- convert from itemid into a meaningful column - , MAX(CASE WHEN itemid = 50889 THEN valuenum ELSE NULL END) AS crp + , MAX( + CASE + WHEN itemid = 50889 AND valueuom = 'mg/L' THEN valuenum ELSE NULL + END + ) AS crp FROM `physionet-data.mimiciv_hosp.labevents` le WHERE le.itemid IN ( @@ -12,6 +16,8 @@ WHERE le.itemid IN 50889 -- crp ) AND valuenum IS NOT NULL + -- CRP (50889) rows with missing valueuom are excluded; mg/L is the expected unit + AND (itemid != 50889 OR valueuom = 'mg/L') -- lab values cannot be 0 and cannot be negative AND valuenum > 0 GROUP BY le.specimen_id From 0da15750d08ed5c26a04301e028cd94a0f69f076 Mon Sep 17 00:00:00 2001 From: Taksh Date: Fri, 31 Jul 2026 13:16:11 +0300 Subject: [PATCH 3/5] chore(mimic-iv): regenerate postgres and duckdb lab concept copies Co-authored-by: Cursor --- .../concepts_duckdb/measurement/complete_blood_count.sql | 5 ++++- mimic-iv/concepts_duckdb/measurement/inflammation.sql | 9 +++++++-- .../measurement/complete_blood_count.sql | 5 ++++- mimic-iv/concepts_postgres/measurement/inflammation.sql | 5 ++++- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/mimic-iv/concepts_duckdb/measurement/complete_blood_count.sql b/mimic-iv/concepts_duckdb/measurement/complete_blood_count.sql index 6dfabe267..18f16e7de 100644 --- a/mimic-iv/concepts_duckdb/measurement/complete_blood_count.sql +++ b/mimic-iv/concepts_duckdb/measurement/complete_blood_count.sql @@ -8,7 +8,7 @@ SELECT MAX(CASE WHEN itemid = 51221 THEN valuenum ELSE NULL END) AS hematocrit, MAX(CASE WHEN itemid = 51222 THEN valuenum ELSE NULL END) AS hemoglobin, MAX(CASE WHEN itemid = 51248 THEN valuenum ELSE NULL END) AS mch, - MAX(CASE WHEN itemid = 51249 THEN valuenum ELSE NULL END) AS mchc, + MAX(CASE WHEN itemid = 51249 AND valueuom = 'g/dL' THEN valuenum ELSE NULL END) AS mchc, MAX(CASE WHEN itemid = 51250 THEN valuenum ELSE NULL END) AS mcv, MAX(CASE WHEN itemid = 51265 THEN valuenum ELSE NULL END) AS platelet, MAX(CASE WHEN itemid = 51279 THEN valuenum ELSE NULL END) AS rbc, @@ -19,6 +19,9 @@ FROM mimiciv_hosp.labevents AS le WHERE le.itemid IN (51221, 51222, 51248, 51249, 51250, 51265, 51279, 51277, 52159, 51301) AND NOT valuenum IS NULL + AND ( + itemid <> 51249 OR valueuom = 'g/dL' + ) AND valuenum > 0 GROUP BY le.specimen_id \ No newline at end of file diff --git a/mimic-iv/concepts_duckdb/measurement/inflammation.sql b/mimic-iv/concepts_duckdb/measurement/inflammation.sql index 6557801ce..18a2c7397 100644 --- a/mimic-iv/concepts_duckdb/measurement/inflammation.sql +++ b/mimic-iv/concepts_duckdb/measurement/inflammation.sql @@ -5,9 +5,14 @@ SELECT MAX(hadm_id) AS hadm_id, MAX(charttime) AS charttime, le.specimen_id, - MAX(CASE WHEN itemid = 50889 THEN valuenum ELSE NULL END) AS crp + MAX(CASE WHEN itemid = 50889 AND valueuom = 'mg/L' THEN valuenum ELSE NULL END) AS crp FROM mimiciv_hosp.labevents AS le WHERE - le.itemid IN (50889) AND NOT valuenum IS NULL AND valuenum > 0 + le.itemid IN (50889) + AND NOT valuenum IS NULL + AND ( + itemid <> 50889 OR valueuom = 'mg/L' + ) + AND valuenum > 0 GROUP BY le.specimen_id \ No newline at end of file diff --git a/mimic-iv/concepts_postgres/measurement/complete_blood_count.sql b/mimic-iv/concepts_postgres/measurement/complete_blood_count.sql index 3c408cfec..5a8157584 100644 --- a/mimic-iv/concepts_postgres/measurement/complete_blood_count.sql +++ b/mimic-iv/concepts_postgres/measurement/complete_blood_count.sql @@ -9,7 +9,7 @@ SELECT MAX(CASE WHEN itemid = 51221 THEN valuenum ELSE NULL END) AS hematocrit, MAX(CASE WHEN itemid = 51222 THEN valuenum ELSE NULL END) AS hemoglobin, MAX(CASE WHEN itemid = 51248 THEN valuenum ELSE NULL END) AS mch, - MAX(CASE WHEN itemid = 51249 THEN valuenum ELSE NULL END) AS mchc, + MAX(CASE WHEN itemid = 51249 AND valueuom = 'g/dL' THEN valuenum ELSE NULL END) AS mchc, MAX(CASE WHEN itemid = 51250 THEN valuenum ELSE NULL END) AS mcv, MAX(CASE WHEN itemid = 51265 THEN valuenum ELSE NULL END) AS platelet, MAX(CASE WHEN itemid = 51279 THEN valuenum ELSE NULL END) AS rbc, @@ -31,6 +31,9 @@ WHERE 51301 /* WBC */ ) AND NOT valuenum IS NULL + AND /* MCHC (51249) is sometimes recorded with valueuom '%' in error; keep g/dL only */ ( + itemid <> 51249 OR valueuom = 'g/dL' + ) AND /* lab values cannot be 0 and cannot be negative */ valuenum > 0 GROUP BY le.specimen_id \ No newline at end of file diff --git a/mimic-iv/concepts_postgres/measurement/inflammation.sql b/mimic-iv/concepts_postgres/measurement/inflammation.sql index 4f7f0bc2b..263ae093d 100644 --- a/mimic-iv/concepts_postgres/measurement/inflammation.sql +++ b/mimic-iv/concepts_postgres/measurement/inflammation.sql @@ -5,11 +5,14 @@ SELECT MAX(hadm_id) AS hadm_id, MAX(charttime) AS charttime, le.specimen_id, /* convert from itemid into a meaningful column */ - MAX(CASE WHEN itemid = 50889 THEN valuenum ELSE NULL END) AS crp + MAX(CASE WHEN itemid = 50889 AND valueuom = 'mg/L' THEN valuenum ELSE NULL END) AS crp FROM mimiciv_hosp.labevents AS le WHERE le.itemid IN (50889 /* 51652 -- high sensitivity CRP */ /* crp */) AND NOT valuenum IS NULL + AND /* CRP (50889) rows with missing valueuom are excluded; mg/L is the expected unit */ ( + itemid <> 50889 OR valueuom = 'mg/L' + ) AND /* lab values cannot be 0 and cannot be negative */ valuenum > 0 GROUP BY le.specimen_id \ No newline at end of file From 4f37c55e904ca1397cb1dc13c1b9475f42fcd106 Mon Sep 17 00:00:00 2001 From: Taksh Date: Sat, 1 Aug 2026 15:14:25 +0300 Subject: [PATCH 4/5] ci: ignore SQLFluff annotate failures on fork PRs Fork tokens cannot create check runs; keep lint green with ignore-unauthorized-error and skip annotate when no concept SQL changed. Co-authored-by: Cursor --- .github/workflows/lint_sqlfluff.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lint_sqlfluff.yml b/.github/workflows/lint_sqlfluff.yml index 0986785bf..71f08fca2 100644 --- a/.github/workflows/lint_sqlfluff.yml +++ b/.github/workflows/lint_sqlfluff.yml @@ -1,11 +1,16 @@ name: SQLFluff +# Lints changed mimic-iv/concepts/*.sql on pull requests and posts GitHub +# annotations. permissions + ignore-unauthorized-error keep fork PRs usable. on: - pull_request jobs: lint-mimic-iv: runs-on: ubuntu-latest + permissions: + contents: read + checks: write steps: - name: checkout uses: actions/checkout@v7 @@ -35,8 +40,10 @@ jobs: shell: bash run: sqlfluff lint --format github-annotation --annotation-level failure --nofail ${{ steps.get_files_to_lint.outputs.lintees }} > annotations.json - name: Annotate + if: steps.get_files_to_lint.outputs.lintees != '' uses: yuzutech/annotations-action@v0.6.0 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" title: "SQLFluff Lint" - input: "./annotations.json" \ No newline at end of file + input: "./annotations.json" + ignore-unauthorized-error: true From 65d24512d5678c61e1ab01d1bd37e92191c201a8 Mon Sep 17 00:00:00 2001 From: Taksh Date: Sat, 1 Aug 2026 15:16:31 +0300 Subject: [PATCH 5/5] ci: skip SQLFluff Annotate on fork PRs ignore-unauthorized-error does not catch the fork 403 (Resource not accessible by integration). Skip Annotate when head.repo != base repo so lint-mimic-iv can stay green. --- .github/workflows/lint_sqlfluff.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint_sqlfluff.yml b/.github/workflows/lint_sqlfluff.yml index 71f08fca2..d6e1c3f0b 100644 --- a/.github/workflows/lint_sqlfluff.yml +++ b/.github/workflows/lint_sqlfluff.yml @@ -1,7 +1,8 @@ name: SQLFluff # Lints changed mimic-iv/concepts/*.sql on pull requests and posts GitHub -# annotations. permissions + ignore-unauthorized-error keep fork PRs usable. +# annotations. Fork PRs skip Annotate — GITHUB_TOKEN cannot create check runs +# from forks (Resource not accessible by integration / 403). on: - pull_request @@ -40,7 +41,11 @@ jobs: shell: bash run: sqlfluff lint --format github-annotation --annotation-level failure --nofail ${{ steps.get_files_to_lint.outputs.lintees }} > annotations.json - name: Annotate - if: steps.get_files_to_lint.outputs.lintees != '' + # Same-repo PRs only: fork tokens get 403 creating check runs, and + # ignore-unauthorized-error does not treat that as unauthorized. + if: > + steps.get_files_to_lint.outputs.lintees != '' && + github.event.pull_request.head.repo.full_name == github.repository uses: yuzutech/annotations-action@v0.6.0 with: repo-token: "${{ secrets.GITHUB_TOKEN }}"