Skip to content

Commit 663dcb5

Browse files
committed
fix(1193): address code review findings for Monthly Transactions I
1 parent a862c49 commit 663dcb5

5 files changed

Lines changed: 138 additions & 25 deletions

File tree

SQL/Leetcode/Intermediate Select/1193. Monthly Transactions I/Claude Sonnet 4.6 Extended/Monthly_Transactions_I.html

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,70 @@
44
<meta charset="UTF-8" />
55
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
66
<title>LeetCode 1193 - Monthly Transactions I</title>
7-
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
8-
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
9-
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
7+
<script
8+
src="https://unpkg.com/react@18.3.1/umd/react.production.min.js"
9+
integrity="sha384-DGyLxAyjq0f9SPpVevD6IgztCFlnMF6oW/XQGmfe+IsZ8TqEiDrcHkMLKI6fiB/Z"
10+
crossorigin="anonymous"
11+
></script>
12+
<script
13+
src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js"
14+
integrity="sha384-gTGxhz21lVGYNMcdJOyq01Edg0jhn/c22nsx0kyqP0TxaV5WVdsSH1fSDUf5YJj1"
15+
crossorigin="anonymous"
16+
></script>
17+
<script
18+
src="https://unpkg.com/@babel/standalone@7.24.7/babel.min.js"
19+
integrity="sha384-AISI5AuDG6E8DeEiFMVB3rGQxhZt24OU0avMp+GMV64+tpnA3+Z6F5MT0f96iPva"
20+
crossorigin="anonymous"
21+
></script>
1022
<script src="https://cdn.tailwindcss.com"></script>
1123
<link
1224
rel="stylesheet"
1325
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css"
26+
integrity="sha384-wFjoQjtV1y5jVHbt0p35Ui8aV8GVpEZkyF99OXWqP/eNJDU93D3Ugxkoyh6Y2I4A"
27+
crossorigin="anonymous"
1428
/>
1529
<link
1630
rel="stylesheet"
1731
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.css"
32+
integrity="sha384-nUkTNLI8COlMCRJ0FHIdX76If83145OTCLUx4gQyfnO0gGeO/sD9czGEUBxtkcUv"
33+
crossorigin="anonymous"
1834
/>
1935
<link
2036
rel="stylesheet"
2137
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.css"
38+
integrity="sha384-EUzJ34/1CCeefTGUKLgvA5Z/vYIwi+Jyu8aAaCfFDxfwZ3Xs3OfkkIeegsLRM11e"
39+
crossorigin="anonymous"
2240
/>
23-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
24-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-sql.min.js"></script>
25-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"></script>
26-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
27-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"></script>
28-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
41+
<script
42+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"
43+
integrity="sha384-06z5D//U/xpvxZHuUz92xBvq3DqBBFi7Up53HRrbV7Jlv7Yvh/MZ7oenfUe9iCEt"
44+
crossorigin="anonymous"
45+
></script>
46+
<script
47+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-sql.min.js"
48+
integrity="sha384-/MKWdycCDliku23mP5sYXbZNuXrzgmQO/jsVxwPFn99dVOaXRyKsqDjarqpueGAp"
49+
crossorigin="anonymous"
50+
></script>
51+
<script
52+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"
53+
integrity="sha384-WJdEkJKrbsqw0evQ4GB6mlsKe5cGTxBOw4KAEIa52ZLB7DDpliGkwdme/HMa5n1m"
54+
crossorigin="anonymous"
55+
></script>
56+
<script
57+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"
58+
integrity="sha384-6QJu8apxMmB9TiPVWzYKF5pRgKcz7snO0/QU+MrWmgBLECQjoa6erxX2VQ5t41Jd"
59+
crossorigin="anonymous"
60+
></script>
61+
<script
62+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"
63+
integrity="sha384-jC1G68eGEXJpPwMDNqyIUQsQlcUCdCU+a7GGuoV4TUZvM1gLYTMJUDvqBnxtZLWA"
64+
crossorigin="anonymous"
65+
></script>
66+
<script
67+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"
68+
integrity="sha384-ZdEfx8sYX8i4IVXU1tUbqwOp4PBUCCmnpagpiHchnstXkEczkzPfUd9fvBrntM+F"
69+
crossorigin="anonymous"
70+
></script>
2971
<link
3072
href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;600;700&family=JetBrains+Mono:wght@400;600&family=Outfit:wght@400;600;800&display=swap"
3173
rel="stylesheet"
@@ -1102,7 +1144,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
11021144
viewBox="0 0 560 220"
11031145
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
11041146
role="img"
1147+
aria-labelledby="svg-input-title"
11051148
>
1149+
<title id="svg-input-title">Transactions テーブル(入力)</title>
11061150
<rect
11071151
x="10"
11081152
y="10"
@@ -1216,7 +1260,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
12161260
viewBox="0 0 560 220"
12171261
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
12181262
role="img"
1263+
aria-labelledby="svg-month-title"
12191264
>
1265+
<title id="svg-month-title">month 列を追加</title>
12201266
<rect
12211267
x="10"
12221268
y="10"
@@ -1311,7 +1357,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
13111357
viewBox="0 0 560 230"
13121358
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
13131359
role="img"
1360+
aria-labelledby="svg-flag-title"
13141361
>
1362+
<title id="svg-flag-title">is_approved フラグ列</title>
13151363
<rect
13161364
x="10"
13171365
y="10"
@@ -1433,7 +1481,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
14331481
viewBox="0 0 560 240"
14341482
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
14351483
role="img"
1484+
aria-labelledby="svg-group-title"
14361485
>
1486+
<title id="svg-group-title">GROUP BY month × country</title>
14371487
<rect
14381488
x="10"
14391489
y="10"
@@ -1530,7 +1580,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
15301580
viewBox="0 0 580 240"
15311581
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
15321582
role="img"
1583+
aria-labelledby="svg-agg-title"
15331584
>
1585+
<title id="svg-agg-title">4指標を一括集計 + COALESCE</title>
15341586
<rect
15351587
x="10"
15361588
y="10"
@@ -1659,7 +1711,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
16591711
viewBox="0 0 580 240"
16601712
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
16611713
role="img"
1714+
aria-labelledby="svg-result-title"
16621715
>
1716+
<title id="svg-result-title">最終出力(6列)</title>
16631717
<rect
16641718
x="10"
16651719
y="10"

SQL/Leetcode/Intermediate Select/1193. Monthly Transactions I/Claude Sonnet 4.6 Extended/Monthly_Transactions_I_postgresql.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ GROUP BY
8181
| ------------------------------------ | ------------------------------------------------------------------------------------------------------ |
8282
| **`TO_CHAR(trans_date, 'YYYY-MM')`** | `DATE_TRUNC('month', ...)` でも可だが、文字列で `YYYY-MM` を直接得るにはこちらが簡潔 |
8383
| **`COUNT(*) FILTER (WHERE ...)`** | PostgreSQL 独自の ANSI SQL:2003 拡張。`CASE WHEN` より読みやすく、オプティマイザにも意図が伝わりやすい |
84-
| **`SUM(amount) FILTER (...)`** | `ELSE 0` 不要で NULL-safe かつ明快 |
84+
| **`SUM(amount) FILTER (...)`** | 対象行が 0 件のとき **`NULL`** を返すため、必ず `COALESCE(..., 0)` で囲む必要がある |
8585
| **GROUP BY のキー統一** | `SELECT``GROUP BY``TO_CHAR(...)` 式を完全一致させることが必須 |
8686
| **インデックス戦略** | `(trans_date, country, state, amount)` の複合インデックスで Index-Only Scan が期待できる |
8787

generate_index.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@ def generate_index(self) -> None:
174174
title = self.get_html_title(filepath)
175175
except Exception:
176176
title = os.path.basename(filepath)
177+
178+
# Append disambiguator if 'detailed' is in the filename
179+
if 'detailed' in filename.lower():
180+
title += ' (detailed)'
181+
177182
structure[category].append((title, rel_path))
178183

179184
# Sort categories and files
@@ -891,11 +896,11 @@ def generate_index(self) -> None:
891896
def render_category_files(structure, sorted_categories):
892897
"""
893898
Builds HTML fragments for category tabs, per-category file lists, and an aggregated all-files list.
894-
899+
895900
Parameters:
896901
structure (Dict[str, List[Tuple[str, str]]]): Mapping from category name to a list of (title, relative_path) pairs for files in that category.
897902
sorted_categories (List[str]): Ordered list of category names to render; determines the iteration order and tab order.
898-
903+
899904
Returns:
900905
Tuple[str, str, str]: A 3-tuple with:
901906
- tabs_html: HTML for the category tab buttons (includes icon and item count for each category).
@@ -955,4 +960,4 @@ def render_category_files(structure, sorted_categories):
955960
print(f"Successfully updated {output_index_path} with vendored assets at {current_time}")
956961

957962
if __name__ == "__main__":
958-
Solution().generate_index()
963+
Solution().generate_index()

public/SQL/Leetcode/Intermediate Select/1193. Monthly Transactions I/Claude Sonnet 4.6 Extended/Monthly_Transactions_I.html

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,70 @@
44
<meta charset="UTF-8" />
55
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
66
<title>LeetCode 1193 - Monthly Transactions I</title>
7-
<script src="/vendor/react/react.development.js"></script>
8-
<script src="/vendor/react-dom/react-dom.development.js"></script>
9-
<script src="/vendor/babel/babel.min.js"></script>
7+
<script
8+
src="https://unpkg.com/react@18.3.1/umd/react.production.min.js"
9+
integrity="sha384-DGyLxAyjq0f9SPpVevD6IgztCFlnMF6oW/XQGmfe+IsZ8TqEiDrcHkMLKI6fiB/Z"
10+
crossorigin="anonymous"
11+
></script>
12+
<script
13+
src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js"
14+
integrity="sha384-gTGxhz21lVGYNMcdJOyq01Edg0jhn/c22nsx0kyqP0TxaV5WVdsSH1fSDUf5YJj1"
15+
crossorigin="anonymous"
16+
></script>
17+
<script
18+
src="https://unpkg.com/@babel/standalone@7.24.7/babel.min.js"
19+
integrity="sha384-AISI5AuDG6E8DeEiFMVB3rGQxhZt24OU0avMp+GMV64+tpnA3+Z6F5MT0f96iPva"
20+
crossorigin="anonymous"
21+
></script>
1022
<script src="/vendor/tailwindcss/script.js"></script>
1123
<link
1224
rel="stylesheet"
1325
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css"
26+
integrity="sha384-wFjoQjtV1y5jVHbt0p35Ui8aV8GVpEZkyF99OXWqP/eNJDU93D3Ugxkoyh6Y2I4A"
27+
crossorigin="anonymous"
1428
/>
1529
<link
1630
rel="stylesheet"
1731
href="/vendor/prismjs/plugins/line-numbers/prism-line-numbers.css"
32+
integrity="sha384-nUkTNLI8COlMCRJ0FHIdX76If83145OTCLUx4gQyfnO0gGeO/sD9czGEUBxtkcUv"
33+
crossorigin="anonymous"
1834
/>
1935
<link
2036
rel="stylesheet"
2137
href="/vendor/prismjs/plugins/toolbar/prism-toolbar.css"
38+
integrity="sha384-EUzJ34/1CCeefTGUKLgvA5Z/vYIwi+Jyu8aAaCfFDxfwZ3Xs3OfkkIeegsLRM11e"
39+
crossorigin="anonymous"
2240
/>
23-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
24-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-sql.min.js"></script>
25-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"></script>
26-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
27-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"></script>
28-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
41+
<script
42+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"
43+
integrity="sha384-06z5D//U/xpvxZHuUz92xBvq3DqBBFi7Up53HRrbV7Jlv7Yvh/MZ7oenfUe9iCEt"
44+
crossorigin="anonymous"
45+
></script>
46+
<script
47+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-sql.min.js"
48+
integrity="sha384-/MKWdycCDliku23mP5sYXbZNuXrzgmQO/jsVxwPFn99dVOaXRyKsqDjarqpueGAp"
49+
crossorigin="anonymous"
50+
></script>
51+
<script
52+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"
53+
integrity="sha384-WJdEkJKrbsqw0evQ4GB6mlsKe5cGTxBOw4KAEIa52ZLB7DDpliGkwdme/HMa5n1m"
54+
crossorigin="anonymous"
55+
></script>
56+
<script
57+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"
58+
integrity="sha384-6QJu8apxMmB9TiPVWzYKF5pRgKcz7snO0/QU+MrWmgBLECQjoa6erxX2VQ5t41Jd"
59+
crossorigin="anonymous"
60+
></script>
61+
<script
62+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"
63+
integrity="sha384-jC1G68eGEXJpPwMDNqyIUQsQlcUCdCU+a7GGuoV4TUZvM1gLYTMJUDvqBnxtZLWA"
64+
crossorigin="anonymous"
65+
></script>
66+
<script
67+
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"
68+
integrity="sha384-ZdEfx8sYX8i4IVXU1tUbqwOp4PBUCCmnpagpiHchnstXkEczkzPfUd9fvBrntM+F"
69+
crossorigin="anonymous"
70+
></script>
2971
<link
3072
href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;600;700&family=JetBrains+Mono:wght@400;600&family=Outfit:wght@400;600;800&display=swap"
3173
rel="stylesheet"
@@ -1102,7 +1144,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
11021144
viewBox="0 0 560 220"
11031145
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
11041146
role="img"
1147+
aria-labelledby="svg-input-title"
11051148
>
1149+
<title id="svg-input-title">Transactions テーブル(入力)</title>
11061150
<rect
11071151
x="10"
11081152
y="10"
@@ -1216,7 +1260,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
12161260
viewBox="0 0 560 220"
12171261
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
12181262
role="img"
1263+
aria-labelledby="svg-month-title"
12191264
>
1265+
<title id="svg-month-title">month 列を追加</title>
12201266
<rect
12211267
x="10"
12221268
y="10"
@@ -1311,7 +1357,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
13111357
viewBox="0 0 560 230"
13121358
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
13131359
role="img"
1360+
aria-labelledby="svg-flag-title"
13141361
>
1362+
<title id="svg-flag-title">is_approved フラグ列</title>
13151363
<rect
13161364
x="10"
13171365
y="10"
@@ -1433,7 +1481,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
14331481
viewBox="0 0 560 240"
14341482
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
14351483
role="img"
1484+
aria-labelledby="svg-group-title"
14361485
>
1486+
<title id="svg-group-title">GROUP BY month × country</title>
14371487
<rect
14381488
x="10"
14391489
y="10"
@@ -1530,7 +1580,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
15301580
viewBox="0 0 580 240"
15311581
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
15321582
role="img"
1583+
aria-labelledby="svg-agg-title"
15331584
>
1585+
<title id="svg-agg-title">4指標を一括集計 + COALESCE</title>
15341586
<rect
15351587
x="10"
15361588
y="10"
@@ -1659,7 +1711,9 @@ <h3 class="font-bold text-teal-800 text-lg mb-3">手法比較</h3>
16591711
viewBox="0 0 580 240"
16601712
style={{ maxWidth: '100%', height: 'auto', marginTop: '16px' }}
16611713
role="img"
1714+
aria-labelledby="svg-result-title"
16621715
>
1716+
<title id="svg-result-title">最終出力(6列)</title>
16631717
<rect
16641718
x="10"
16651719
y="10"

0 commit comments

Comments
 (0)