Reaver1000 commited on
Commit
4921ddf
·
verified ·
1 Parent(s): 392b58d

SQL playground on DuckDB WASM: in-browser warehouse + 55 tested templates

Browse files
Files changed (7) hide show
  1. README.md +24 -6
  2. data/customers.csv +1001 -0
  3. data/order_items.csv +0 -0
  4. data/orders.csv +0 -0
  5. data/products.csv +101 -0
  6. index.html +291 -18
  7. templates.json +1 -0
README.md CHANGED
@@ -1,10 +1,28 @@
1
  ---
2
- title: Sql Query Playground
3
- emoji: 👁
4
- colorFrom: red
5
- colorTo: blue
6
  sdk: static
7
- pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: SQL Query Playground
3
+ emoji: 🦆
4
+ colorFrom: indigo
5
+ colorTo: gray
6
  sdk: static
7
+ pinned: true
8
+ license: mit
9
+ short_description: Real SQL against DuckDB WASM — runs in your browser
10
  ---
11
 
12
+ # SQL Query Playground
13
+
14
+ Write and run **real SQL against a seeded warehouse** — DuckDB compiled to
15
+ WebAssembly, executed entirely in your browser. Nothing is uploaded, no server
16
+ exists: the database, the engine and the results all live on your machine.
17
+
18
+ - **55 tested templates** — window functions, cohort queries, funnel metrics,
19
+ date arithmetic — every template is also executed in CI against the same data.
20
+ - Schema browser for the four-table warehouse (1,000 customers, 5,000 orders,
21
+ 12,663 line items), seeded deterministically.
22
+ - Ctrl+Enter to run; query timing and row counts shown on every execution.
23
+
24
+ Not a simulation: every query is parsed, typed and executed by a real DuckDB
25
+ engine. Errors surface as data — the way production pipelines treat failures.
26
+
27
+ - Code + template library: [sql-query-builder on GitHub](https://github.com/Reaver1000/sql-query-builder)
28
+ - Built by [David Buchan](https://reaver1000.github.io) — AI, automation and data work
data/customers.csv ADDED
@@ -0,0 +1,1001 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ customer_id,email,name,country,created_at,segment
2
+ 1,customer1@example.com,Customer 1,France,2024-02-20,Basic
3
+ 2,customer2@example.com,Customer 2,USA,2024-12-17,Standard
4
+ 3,customer3@example.com,Customer 3,USA,2024-07-07,Basic
5
+ 4,customer4@example.com,Customer 4,USA,2024-10-05,Basic
6
+ 5,customer5@example.com,Customer 5,Canada,2024-11-26,Premium
7
+ 6,customer6@example.com,Customer 6,Canada,2024-07-02,Basic
8
+ 7,customer7@example.com,Customer 7,Japan,2024-02-01,Standard
9
+ 8,customer8@example.com,Customer 8,USA,2024-07-22,Basic
10
+ 9,customer9@example.com,Customer 9,UK,2024-05-21,Standard
11
+ 10,customer10@example.com,Customer 10,USA,2024-04-07,Basic
12
+ 11,customer11@example.com,Customer 11,USA,2024-03-03,Basic
13
+ 12,customer12@example.com,Customer 12,Germany,2024-08-20,Standard
14
+ 13,customer13@example.com,Customer 13,USA,2024-02-16,Standard
15
+ 14,customer14@example.com,Customer 14,USA,2024-12-05,Standard
16
+ 15,customer15@example.com,Customer 15,France,2024-04-18,Premium
17
+ 16,customer16@example.com,Customer 16,Germany,2024-11-24,Premium
18
+ 17,customer17@example.com,Customer 17,USA,2024-11-23,Standard
19
+ 18,customer18@example.com,Customer 18,France,2024-11-01,Standard
20
+ 19,customer19@example.com,Customer 19,Australia,2024-01-11,Standard
21
+ 20,customer20@example.com,Customer 20,USA,2024-01-26,Standard
22
+ 21,customer21@example.com,Customer 21,Australia,2024-06-19,Standard
23
+ 22,customer22@example.com,Customer 22,Canada,2024-05-04,Standard
24
+ 23,customer23@example.com,Customer 23,UK,2024-03-05,Standard
25
+ 24,customer24@example.com,Customer 24,USA,2024-10-16,Standard
26
+ 25,customer25@example.com,Customer 25,Brazil,2024-04-15,Basic
27
+ 26,customer26@example.com,Customer 26,UK,2024-02-05,Basic
28
+ 27,customer27@example.com,Customer 27,USA,2024-10-10,Standard
29
+ 28,customer28@example.com,Customer 28,USA,2024-04-16,Standard
30
+ 29,customer29@example.com,Customer 29,Japan,2024-10-27,Basic
31
+ 30,customer30@example.com,Customer 30,France,2024-04-20,Standard
32
+ 31,customer31@example.com,Customer 31,Australia,2024-04-29,Basic
33
+ 32,customer32@example.com,Customer 32,Canada,2024-06-17,Standard
34
+ 33,customer33@example.com,Customer 33,Germany,2024-03-16,Basic
35
+ 34,customer34@example.com,Customer 34,Brazil,2024-11-01,Standard
36
+ 35,customer35@example.com,Customer 35,UK,2024-01-02,Basic
37
+ 36,customer36@example.com,Customer 36,Germany,2024-05-21,Basic
38
+ 37,customer37@example.com,Customer 37,Australia,2024-03-15,Standard
39
+ 38,customer38@example.com,Customer 38,France,2024-03-07,Basic
40
+ 39,customer39@example.com,Customer 39,Japan,2024-10-03,Basic
41
+ 40,customer40@example.com,Customer 40,France,2024-05-08,Basic
42
+ 41,customer41@example.com,Customer 41,Canada,2024-03-30,Premium
43
+ 42,customer42@example.com,Customer 42,USA,2024-02-26,Standard
44
+ 43,customer43@example.com,Customer 43,USA,2024-12-04,Basic
45
+ 44,customer44@example.com,Customer 44,USA,2024-01-14,Basic
46
+ 45,customer45@example.com,Customer 45,USA,2024-03-08,Basic
47
+ 46,customer46@example.com,Customer 46,USA,2024-01-08,Standard
48
+ 47,customer47@example.com,Customer 47,USA,2024-07-02,Basic
49
+ 48,customer48@example.com,Customer 48,USA,2024-05-01,Standard
50
+ 49,customer49@example.com,Customer 49,France,2024-10-28,Standard
51
+ 50,customer50@example.com,Customer 50,UK,2024-06-14,Standard
52
+ 51,customer51@example.com,Customer 51,UK,2024-01-09,Standard
53
+ 52,customer52@example.com,Customer 52,USA,2024-03-30,Basic
54
+ 53,customer53@example.com,Customer 53,USA,2024-05-15,Premium
55
+ 54,customer54@example.com,Customer 54,Brazil,2024-01-27,Basic
56
+ 55,customer55@example.com,Customer 55,France,2024-03-05,Premium
57
+ 56,customer56@example.com,Customer 56,France,2024-08-03,Basic
58
+ 57,customer57@example.com,Customer 57,USA,2024-09-26,Premium
59
+ 58,customer58@example.com,Customer 58,Canada,2024-02-28,Premium
60
+ 59,customer59@example.com,Customer 59,USA,2024-02-02,Standard
61
+ 60,customer60@example.com,Customer 60,UK,2024-08-31,Standard
62
+ 61,customer61@example.com,Customer 61,Brazil,2024-08-17,Basic
63
+ 62,customer62@example.com,Customer 62,France,2024-07-04,Standard
64
+ 63,customer63@example.com,Customer 63,Germany,2024-09-19,Basic
65
+ 64,customer64@example.com,Customer 64,Canada,2024-10-30,Basic
66
+ 65,customer65@example.com,Customer 65,Japan,2024-02-25,Basic
67
+ 66,customer66@example.com,Customer 66,Australia,2024-08-19,Basic
68
+ 67,customer67@example.com,Customer 67,USA,2024-09-14,Premium
69
+ 68,customer68@example.com,Customer 68,USA,2024-04-23,Premium
70
+ 69,customer69@example.com,Customer 69,UK,2024-11-10,Standard
71
+ 70,customer70@example.com,Customer 70,USA,2024-01-23,Standard
72
+ 71,customer71@example.com,Customer 71,USA,2024-12-03,Basic
73
+ 72,customer72@example.com,Customer 72,Brazil,2024-09-23,Standard
74
+ 73,customer73@example.com,Customer 73,Japan,2024-06-03,Standard
75
+ 74,customer74@example.com,Customer 74,UK,2024-08-22,Standard
76
+ 75,customer75@example.com,Customer 75,France,2024-11-25,Basic
77
+ 76,customer76@example.com,Customer 76,UK,2024-01-16,Standard
78
+ 77,customer77@example.com,Customer 77,Brazil,2024-02-01,Standard
79
+ 78,customer78@example.com,Customer 78,Germany,2024-09-02,Basic
80
+ 79,customer79@example.com,Customer 79,USA,2024-07-24,Basic
81
+ 80,customer80@example.com,Customer 80,USA,2024-08-06,Standard
82
+ 81,customer81@example.com,Customer 81,Germany,2024-12-17,Basic
83
+ 82,customer82@example.com,Customer 82,USA,2024-02-25,Standard
84
+ 83,customer83@example.com,Customer 83,France,2024-09-08,Standard
85
+ 84,customer84@example.com,Customer 84,Japan,2024-12-30,Standard
86
+ 85,customer85@example.com,Customer 85,UK,2024-08-15,Standard
87
+ 86,customer86@example.com,Customer 86,USA,2024-02-07,Standard
88
+ 87,customer87@example.com,Customer 87,Brazil,2024-02-11,Basic
89
+ 88,customer88@example.com,Customer 88,Germany,2024-06-13,Standard
90
+ 89,customer89@example.com,Customer 89,USA,2024-11-07,Standard
91
+ 90,customer90@example.com,Customer 90,USA,2024-03-16,Standard
92
+ 91,customer91@example.com,Customer 91,USA,2024-02-03,Basic
93
+ 92,customer92@example.com,Customer 92,France,2024-03-05,Standard
94
+ 93,customer93@example.com,Customer 93,Australia,2024-05-20,Standard
95
+ 94,customer94@example.com,Customer 94,UK,2024-11-15,Basic
96
+ 95,customer95@example.com,Customer 95,USA,2024-11-20,Basic
97
+ 96,customer96@example.com,Customer 96,UK,2024-10-26,Standard
98
+ 97,customer97@example.com,Customer 97,Brazil,2024-10-07,Premium
99
+ 98,customer98@example.com,Customer 98,Germany,2024-12-30,Basic
100
+ 99,customer99@example.com,Customer 99,Brazil,2024-06-15,Standard
101
+ 100,customer100@example.com,Customer 100,Japan,2024-07-14,Basic
102
+ 101,customer101@example.com,Customer 101,USA,2024-11-01,Basic
103
+ 102,customer102@example.com,Customer 102,Canada,2024-09-28,Basic
104
+ 103,customer103@example.com,Customer 103,Canada,2024-05-30,Basic
105
+ 104,customer104@example.com,Customer 104,Germany,2024-08-20,Standard
106
+ 105,customer105@example.com,Customer 105,USA,2024-09-15,Standard
107
+ 106,customer106@example.com,Customer 106,France,2024-11-05,Basic
108
+ 107,customer107@example.com,Customer 107,USA,2024-08-08,Standard
109
+ 108,customer108@example.com,Customer 108,UK,2024-02-20,Standard
110
+ 109,customer109@example.com,Customer 109,Germany,2024-12-25,Standard
111
+ 110,customer110@example.com,Customer 110,Brazil,2024-02-28,Standard
112
+ 111,customer111@example.com,Customer 111,Japan,2024-12-01,Standard
113
+ 112,customer112@example.com,Customer 112,USA,2024-11-29,Standard
114
+ 113,customer113@example.com,Customer 113,Germany,2024-10-09,Basic
115
+ 114,customer114@example.com,Customer 114,USA,2024-04-20,Basic
116
+ 115,customer115@example.com,Customer 115,Brazil,2024-08-08,Premium
117
+ 116,customer116@example.com,Customer 116,Japan,2024-08-19,Standard
118
+ 117,customer117@example.com,Customer 117,USA,2024-04-26,Standard
119
+ 118,customer118@example.com,Customer 118,France,2024-07-30,Standard
120
+ 119,customer119@example.com,Customer 119,France,2024-06-22,Basic
121
+ 120,customer120@example.com,Customer 120,USA,2024-08-20,Standard
122
+ 121,customer121@example.com,Customer 121,Australia,2024-07-23,Standard
123
+ 122,customer122@example.com,Customer 122,Germany,2024-07-31,Premium
124
+ 123,customer123@example.com,Customer 123,Australia,2024-02-18,Standard
125
+ 124,customer124@example.com,Customer 124,Germany,2024-06-09,Basic
126
+ 125,customer125@example.com,Customer 125,USA,2024-08-06,Premium
127
+ 126,customer126@example.com,Customer 126,UK,2024-06-09,Basic
128
+ 127,customer127@example.com,Customer 127,USA,2024-12-06,Premium
129
+ 128,customer128@example.com,Customer 128,Brazil,2024-05-10,Standard
130
+ 129,customer129@example.com,Customer 129,Japan,2024-07-10,Basic
131
+ 130,customer130@example.com,Customer 130,Japan,2024-03-19,Standard
132
+ 131,customer131@example.com,Customer 131,UK,2024-12-17,Basic
133
+ 132,customer132@example.com,Customer 132,USA,2024-08-30,Basic
134
+ 133,customer133@example.com,Customer 133,Japan,2024-02-04,Standard
135
+ 134,customer134@example.com,Customer 134,Brazil,2024-02-16,Standard
136
+ 135,customer135@example.com,Customer 135,USA,2024-02-13,Basic
137
+ 136,customer136@example.com,Customer 136,Germany,2024-02-17,Standard
138
+ 137,customer137@example.com,Customer 137,USA,2024-08-09,Standard
139
+ 138,customer138@example.com,Customer 138,Australia,2024-02-19,Basic
140
+ 139,customer139@example.com,Customer 139,Australia,2024-07-09,Premium
141
+ 140,customer140@example.com,Customer 140,USA,2024-03-07,Standard
142
+ 141,customer141@example.com,Customer 141,Germany,2024-10-11,Standard
143
+ 142,customer142@example.com,Customer 142,Germany,2024-01-31,Basic
144
+ 143,customer143@example.com,Customer 143,USA,2024-10-27,Basic
145
+ 144,customer144@example.com,Customer 144,Japan,2024-10-14,Basic
146
+ 145,customer145@example.com,Customer 145,UK,2024-10-14,Standard
147
+ 146,customer146@example.com,Customer 146,USA,2024-06-17,Basic
148
+ 147,customer147@example.com,Customer 147,Germany,2024-12-09,Standard
149
+ 148,customer148@example.com,Customer 148,Canada,2024-03-03,Basic
150
+ 149,customer149@example.com,Customer 149,USA,2024-07-29,Basic
151
+ 150,customer150@example.com,Customer 150,UK,2024-06-30,Standard
152
+ 151,customer151@example.com,Customer 151,Brazil,2024-12-06,Standard
153
+ 152,customer152@example.com,Customer 152,France,2024-08-04,Basic
154
+ 153,customer153@example.com,Customer 153,UK,2024-01-27,Basic
155
+ 154,customer154@example.com,Customer 154,Germany,2024-05-27,Basic
156
+ 155,customer155@example.com,Customer 155,USA,2024-11-03,Basic
157
+ 156,customer156@example.com,Customer 156,USA,2024-06-08,Premium
158
+ 157,customer157@example.com,Customer 157,UK,2024-06-29,Standard
159
+ 158,customer158@example.com,Customer 158,France,2024-02-23,Premium
160
+ 159,customer159@example.com,Customer 159,USA,2024-10-22,Basic
161
+ 160,customer160@example.com,Customer 160,USA,2024-09-16,Standard
162
+ 161,customer161@example.com,Customer 161,USA,2024-04-18,Basic
163
+ 162,customer162@example.com,Customer 162,France,2024-03-20,Standard
164
+ 163,customer163@example.com,Customer 163,USA,2024-12-02,Standard
165
+ 164,customer164@example.com,Customer 164,Brazil,2024-09-03,Basic
166
+ 165,customer165@example.com,Customer 165,Japan,2024-04-24,Basic
167
+ 166,customer166@example.com,Customer 166,USA,2024-02-25,Standard
168
+ 167,customer167@example.com,Customer 167,USA,2024-06-28,Standard
169
+ 168,customer168@example.com,Customer 168,France,2024-10-11,Premium
170
+ 169,customer169@example.com,Customer 169,USA,2024-07-07,Standard
171
+ 170,customer170@example.com,Customer 170,USA,2024-02-28,Standard
172
+ 171,customer171@example.com,Customer 171,Brazil,2024-05-22,Standard
173
+ 172,customer172@example.com,Customer 172,France,2024-10-20,Standard
174
+ 173,customer173@example.com,Customer 173,Germany,2024-04-25,Basic
175
+ 174,customer174@example.com,Customer 174,Australia,2024-08-07,Basic
176
+ 175,customer175@example.com,Customer 175,Australia,2024-10-14,Standard
177
+ 176,customer176@example.com,Customer 176,USA,2024-11-14,Basic
178
+ 177,customer177@example.com,Customer 177,USA,2024-11-10,Standard
179
+ 178,customer178@example.com,Customer 178,UK,2024-12-11,Basic
180
+ 179,customer179@example.com,Customer 179,UK,2024-11-25,Basic
181
+ 180,customer180@example.com,Customer 180,Germany,2024-10-12,Basic
182
+ 181,customer181@example.com,Customer 181,Canada,2024-01-14,Standard
183
+ 182,customer182@example.com,Customer 182,Canada,2024-11-07,Premium
184
+ 183,customer183@example.com,Customer 183,Brazil,2024-12-02,Basic
185
+ 184,customer184@example.com,Customer 184,USA,2024-12-21,Standard
186
+ 185,customer185@example.com,Customer 185,UK,2024-05-16,Premium
187
+ 186,customer186@example.com,Customer 186,UK,2024-01-15,Standard
188
+ 187,customer187@example.com,Customer 187,Japan,2024-04-02,Standard
189
+ 188,customer188@example.com,Customer 188,USA,2024-05-19,Standard
190
+ 189,customer189@example.com,Customer 189,USA,2024-12-25,Standard
191
+ 190,customer190@example.com,Customer 190,UK,2024-06-07,Basic
192
+ 191,customer191@example.com,Customer 191,UK,2024-06-22,Basic
193
+ 192,customer192@example.com,Customer 192,USA,2024-06-28,Standard
194
+ 193,customer193@example.com,Customer 193,USA,2024-01-04,Basic
195
+ 194,customer194@example.com,Customer 194,Brazil,2024-04-02,Premium
196
+ 195,customer195@example.com,Customer 195,UK,2024-03-14,Basic
197
+ 196,customer196@example.com,Customer 196,Japan,2024-10-16,Basic
198
+ 197,customer197@example.com,Customer 197,Germany,2024-12-02,Premium
199
+ 198,customer198@example.com,Customer 198,USA,2024-07-24,Premium
200
+ 199,customer199@example.com,Customer 199,Brazil,2024-02-05,Standard
201
+ 200,customer200@example.com,Customer 200,Japan,2024-03-13,Standard
202
+ 201,customer201@example.com,Customer 201,Brazil,2024-11-20,Standard
203
+ 202,customer202@example.com,Customer 202,Brazil,2024-01-16,Basic
204
+ 203,customer203@example.com,Customer 203,Japan,2024-02-16,Basic
205
+ 204,customer204@example.com,Customer 204,USA,2024-09-28,Standard
206
+ 205,customer205@example.com,Customer 205,Germany,2024-04-20,Premium
207
+ 206,customer206@example.com,Customer 206,USA,2024-07-11,Basic
208
+ 207,customer207@example.com,Customer 207,UK,2024-08-02,Standard
209
+ 208,customer208@example.com,Customer 208,USA,2024-08-20,Standard
210
+ 209,customer209@example.com,Customer 209,UK,2024-06-23,Standard
211
+ 210,customer210@example.com,Customer 210,Brazil,2024-03-21,Premium
212
+ 211,customer211@example.com,Customer 211,USA,2024-07-08,Standard
213
+ 212,customer212@example.com,Customer 212,Australia,2024-06-08,Basic
214
+ 213,customer213@example.com,Customer 213,Germany,2024-06-15,Standard
215
+ 214,customer214@example.com,Customer 214,UK,2024-10-17,Standard
216
+ 215,customer215@example.com,Customer 215,Brazil,2024-11-01,Standard
217
+ 216,customer216@example.com,Customer 216,Brazil,2024-02-13,Standard
218
+ 217,customer217@example.com,Customer 217,Germany,2024-01-27,Standard
219
+ 218,customer218@example.com,Customer 218,Canada,2024-03-20,Basic
220
+ 219,customer219@example.com,Customer 219,USA,2024-03-21,Standard
221
+ 220,customer220@example.com,Customer 220,USA,2024-11-12,Standard
222
+ 221,customer221@example.com,Customer 221,Brazil,2024-01-26,Basic
223
+ 222,customer222@example.com,Customer 222,France,2024-12-11,Basic
224
+ 223,customer223@example.com,Customer 223,Germany,2024-02-11,Premium
225
+ 224,customer224@example.com,Customer 224,Canada,2024-05-19,Standard
226
+ 225,customer225@example.com,Customer 225,USA,2024-08-14,Basic
227
+ 226,customer226@example.com,Customer 226,France,2024-12-04,Premium
228
+ 227,customer227@example.com,Customer 227,Germany,2024-08-05,Standard
229
+ 228,customer228@example.com,Customer 228,Japan,2024-09-05,Premium
230
+ 229,customer229@example.com,Customer 229,USA,2024-11-06,Standard
231
+ 230,customer230@example.com,Customer 230,Brazil,2024-08-14,Standard
232
+ 231,customer231@example.com,Customer 231,USA,2024-07-31,Standard
233
+ 232,customer232@example.com,Customer 232,USA,2024-05-19,Premium
234
+ 233,customer233@example.com,Customer 233,France,2024-04-20,Standard
235
+ 234,customer234@example.com,Customer 234,Canada,2024-09-19,Standard
236
+ 235,customer235@example.com,Customer 235,USA,2024-02-28,Premium
237
+ 236,customer236@example.com,Customer 236,USA,2024-06-25,Standard
238
+ 237,customer237@example.com,Customer 237,Japan,2024-08-08,Standard
239
+ 238,customer238@example.com,Customer 238,USA,2024-02-26,Premium
240
+ 239,customer239@example.com,Customer 239,France,2024-05-25,Standard
241
+ 240,customer240@example.com,Customer 240,France,2024-12-13,Basic
242
+ 241,customer241@example.com,Customer 241,UK,2024-12-13,Standard
243
+ 242,customer242@example.com,Customer 242,France,2024-10-30,Standard
244
+ 243,customer243@example.com,Customer 243,Germany,2024-09-06,Standard
245
+ 244,customer244@example.com,Customer 244,Brazil,2024-09-26,Premium
246
+ 245,customer245@example.com,Customer 245,USA,2024-12-07,Standard
247
+ 246,customer246@example.com,Customer 246,Canada,2024-06-06,Basic
248
+ 247,customer247@example.com,Customer 247,USA,2024-01-24,Basic
249
+ 248,customer248@example.com,Customer 248,UK,2024-04-22,Standard
250
+ 249,customer249@example.com,Customer 249,Canada,2024-07-21,Basic
251
+ 250,customer250@example.com,Customer 250,USA,2024-11-02,Basic
252
+ 251,customer251@example.com,Customer 251,UK,2024-01-29,Standard
253
+ 252,customer252@example.com,Customer 252,Australia,2024-01-04,Premium
254
+ 253,customer253@example.com,Customer 253,USA,2024-04-14,Standard
255
+ 254,customer254@example.com,Customer 254,Germany,2024-06-03,Premium
256
+ 255,customer255@example.com,Customer 255,Brazil,2024-04-18,Basic
257
+ 256,customer256@example.com,Customer 256,Brazil,2024-03-11,Basic
258
+ 257,customer257@example.com,Customer 257,USA,2024-05-10,Premium
259
+ 258,customer258@example.com,Customer 258,USA,2024-05-28,Basic
260
+ 259,customer259@example.com,Customer 259,USA,2024-06-16,Premium
261
+ 260,customer260@example.com,Customer 260,Brazil,2024-03-02,Standard
262
+ 261,customer261@example.com,Customer 261,Japan,2024-01-04,Basic
263
+ 262,customer262@example.com,Customer 262,Japan,2024-09-11,Basic
264
+ 263,customer263@example.com,Customer 263,UK,2024-08-08,Basic
265
+ 264,customer264@example.com,Customer 264,USA,2024-03-30,Standard
266
+ 265,customer265@example.com,Customer 265,Japan,2024-03-07,Standard
267
+ 266,customer266@example.com,Customer 266,Canada,2024-07-13,Basic
268
+ 267,customer267@example.com,Customer 267,France,2024-09-29,Standard
269
+ 268,customer268@example.com,Customer 268,Brazil,2024-12-26,Basic
270
+ 269,customer269@example.com,Customer 269,France,2024-04-27,Basic
271
+ 270,customer270@example.com,Customer 270,USA,2024-09-13,Standard
272
+ 271,customer271@example.com,Customer 271,Australia,2024-10-13,Basic
273
+ 272,customer272@example.com,Customer 272,USA,2024-12-08,Basic
274
+ 273,customer273@example.com,Customer 273,France,2024-06-30,Standard
275
+ 274,customer274@example.com,Customer 274,Brazil,2024-02-06,Basic
276
+ 275,customer275@example.com,Customer 275,USA,2024-07-22,Standard
277
+ 276,customer276@example.com,Customer 276,USA,2024-01-22,Standard
278
+ 277,customer277@example.com,Customer 277,USA,2024-08-11,Standard
279
+ 278,customer278@example.com,Customer 278,Germany,2024-01-10,Standard
280
+ 279,customer279@example.com,Customer 279,USA,2024-08-23,Basic
281
+ 280,customer280@example.com,Customer 280,France,2024-02-09,Standard
282
+ 281,customer281@example.com,Customer 281,Canada,2024-06-09,Premium
283
+ 282,customer282@example.com,Customer 282,USA,2024-10-21,Premium
284
+ 283,customer283@example.com,Customer 283,France,2024-08-07,Standard
285
+ 284,customer284@example.com,Customer 284,USA,2024-10-20,Basic
286
+ 285,customer285@example.com,Customer 285,Germany,2024-07-26,Standard
287
+ 286,customer286@example.com,Customer 286,Brazil,2024-12-29,Standard
288
+ 287,customer287@example.com,Customer 287,Japan,2024-11-23,Basic
289
+ 288,customer288@example.com,Customer 288,USA,2024-08-01,Standard
290
+ 289,customer289@example.com,Customer 289,UK,2024-05-28,Standard
291
+ 290,customer290@example.com,Customer 290,USA,2024-02-28,Standard
292
+ 291,customer291@example.com,Customer 291,USA,2024-07-26,Basic
293
+ 292,customer292@example.com,Customer 292,Australia,2024-01-11,Basic
294
+ 293,customer293@example.com,Customer 293,France,2024-06-15,Premium
295
+ 294,customer294@example.com,Customer 294,USA,2024-03-28,Basic
296
+ 295,customer295@example.com,Customer 295,Canada,2024-11-12,Standard
297
+ 296,customer296@example.com,Customer 296,Germany,2024-08-23,Basic
298
+ 297,customer297@example.com,Customer 297,UK,2024-12-19,Basic
299
+ 298,customer298@example.com,Customer 298,USA,2024-07-04,Premium
300
+ 299,customer299@example.com,Customer 299,USA,2024-02-15,Standard
301
+ 300,customer300@example.com,Customer 300,Japan,2024-08-11,Premium
302
+ 301,customer301@example.com,Customer 301,Brazil,2024-02-24,Premium
303
+ 302,customer302@example.com,Customer 302,Germany,2024-05-04,Standard
304
+ 303,customer303@example.com,Customer 303,Japan,2024-08-11,Basic
305
+ 304,customer304@example.com,Customer 304,France,2024-10-28,Premium
306
+ 305,customer305@example.com,Customer 305,USA,2024-07-24,Basic
307
+ 306,customer306@example.com,Customer 306,USA,2024-09-25,Standard
308
+ 307,customer307@example.com,Customer 307,UK,2024-02-10,Standard
309
+ 308,customer308@example.com,Customer 308,Japan,2024-07-21,Standard
310
+ 309,customer309@example.com,Customer 309,Australia,2024-06-07,Basic
311
+ 310,customer310@example.com,Customer 310,Japan,2024-06-22,Premium
312
+ 311,customer311@example.com,Customer 311,Japan,2024-04-23,Standard
313
+ 312,customer312@example.com,Customer 312,USA,2024-06-19,Standard
314
+ 313,customer313@example.com,Customer 313,USA,2024-03-27,Basic
315
+ 314,customer314@example.com,Customer 314,USA,2024-02-09,Basic
316
+ 315,customer315@example.com,Customer 315,Australia,2024-09-18,Standard
317
+ 316,customer316@example.com,Customer 316,Japan,2024-11-20,Standard
318
+ 317,customer317@example.com,Customer 317,UK,2024-02-28,Basic
319
+ 318,customer318@example.com,Customer 318,France,2024-09-28,Standard
320
+ 319,customer319@example.com,Customer 319,USA,2024-09-18,Standard
321
+ 320,customer320@example.com,Customer 320,Brazil,2024-04-09,Premium
322
+ 321,customer321@example.com,Customer 321,Japan,2024-06-27,Basic
323
+ 322,customer322@example.com,Customer 322,Brazil,2024-06-28,Standard
324
+ 323,customer323@example.com,Customer 323,Australia,2024-11-26,Standard
325
+ 324,customer324@example.com,Customer 324,Japan,2024-03-16,Premium
326
+ 325,customer325@example.com,Customer 325,USA,2024-04-30,Basic
327
+ 326,customer326@example.com,Customer 326,Canada,2024-02-22,Basic
328
+ 327,customer327@example.com,Customer 327,UK,2024-03-15,Basic
329
+ 328,customer328@example.com,Customer 328,Brazil,2024-05-11,Standard
330
+ 329,customer329@example.com,Customer 329,Australia,2024-04-11,Standard
331
+ 330,customer330@example.com,Customer 330,Japan,2024-03-29,Standard
332
+ 331,customer331@example.com,Customer 331,Australia,2024-11-04,Basic
333
+ 332,customer332@example.com,Customer 332,USA,2024-03-19,Basic
334
+ 333,customer333@example.com,Customer 333,Australia,2024-12-01,Basic
335
+ 334,customer334@example.com,Customer 334,USA,2024-02-08,Basic
336
+ 335,customer335@example.com,Customer 335,Japan,2024-03-31,Standard
337
+ 336,customer336@example.com,Customer 336,Japan,2024-11-17,Standard
338
+ 337,customer337@example.com,Customer 337,USA,2024-09-09,Premium
339
+ 338,customer338@example.com,Customer 338,Australia,2024-08-25,Standard
340
+ 339,customer339@example.com,Customer 339,Germany,2024-10-15,Basic
341
+ 340,customer340@example.com,Customer 340,UK,2024-10-23,Standard
342
+ 341,customer341@example.com,Customer 341,Australia,2024-08-17,Basic
343
+ 342,customer342@example.com,Customer 342,USA,2024-12-14,Standard
344
+ 343,customer343@example.com,Customer 343,USA,2024-10-16,Basic
345
+ 344,customer344@example.com,Customer 344,USA,2024-11-25,Basic
346
+ 345,customer345@example.com,Customer 345,UK,2024-11-21,Basic
347
+ 346,customer346@example.com,Customer 346,Japan,2024-11-15,Standard
348
+ 347,customer347@example.com,Customer 347,Brazil,2024-06-14,Basic
349
+ 348,customer348@example.com,Customer 348,USA,2024-11-17,Standard
350
+ 349,customer349@example.com,Customer 349,France,2024-06-10,Premium
351
+ 350,customer350@example.com,Customer 350,UK,2024-03-18,Standard
352
+ 351,customer351@example.com,Customer 351,Brazil,2024-08-13,Standard
353
+ 352,customer352@example.com,Customer 352,Germany,2024-02-04,Standard
354
+ 353,customer353@example.com,Customer 353,Brazil,2024-08-28,Basic
355
+ 354,customer354@example.com,Customer 354,USA,2024-08-14,Basic
356
+ 355,customer355@example.com,Customer 355,Brazil,2024-11-19,Premium
357
+ 356,customer356@example.com,Customer 356,USA,2024-06-04,Basic
358
+ 357,customer357@example.com,Customer 357,Brazil,2024-05-20,Standard
359
+ 358,customer358@example.com,Customer 358,USA,2024-10-29,Standard
360
+ 359,customer359@example.com,Customer 359,USA,2024-01-29,Basic
361
+ 360,customer360@example.com,Customer 360,UK,2024-06-29,Standard
362
+ 361,customer361@example.com,Customer 361,Canada,2024-09-16,Basic
363
+ 362,customer362@example.com,Customer 362,UK,2024-02-07,Standard
364
+ 363,customer363@example.com,Customer 363,France,2024-06-07,Basic
365
+ 364,customer364@example.com,Customer 364,Germany,2024-08-24,Basic
366
+ 365,customer365@example.com,Customer 365,UK,2024-08-19,Standard
367
+ 366,customer366@example.com,Customer 366,France,2024-01-20,Standard
368
+ 367,customer367@example.com,Customer 367,USA,2024-01-30,Basic
369
+ 368,customer368@example.com,Customer 368,Canada,2024-07-07,Standard
370
+ 369,customer369@example.com,Customer 369,USA,2024-05-26,Basic
371
+ 370,customer370@example.com,Customer 370,Brazil,2024-02-09,Premium
372
+ 371,customer371@example.com,Customer 371,Germany,2024-11-26,Basic
373
+ 372,customer372@example.com,Customer 372,Canada,2024-02-16,Basic
374
+ 373,customer373@example.com,Customer 373,Canada,2024-11-10,Premium
375
+ 374,customer374@example.com,Customer 374,Canada,2024-10-31,Basic
376
+ 375,customer375@example.com,Customer 375,UK,2024-09-16,Standard
377
+ 376,customer376@example.com,Customer 376,USA,2024-07-15,Standard
378
+ 377,customer377@example.com,Customer 377,France,2024-08-24,Standard
379
+ 378,customer378@example.com,Customer 378,UK,2024-10-24,Standard
380
+ 379,customer379@example.com,Customer 379,UK,2024-10-10,Basic
381
+ 380,customer380@example.com,Customer 380,Japan,2024-01-22,Standard
382
+ 381,customer381@example.com,Customer 381,Canada,2024-08-18,Basic
383
+ 382,customer382@example.com,Customer 382,UK,2024-10-19,Standard
384
+ 383,customer383@example.com,Customer 383,UK,2024-11-29,Standard
385
+ 384,customer384@example.com,Customer 384,UK,2024-04-06,Standard
386
+ 385,customer385@example.com,Customer 385,UK,2024-06-13,Standard
387
+ 386,customer386@example.com,Customer 386,USA,2024-11-05,Standard
388
+ 387,customer387@example.com,Customer 387,USA,2024-08-31,Standard
389
+ 388,customer388@example.com,Customer 388,UK,2024-09-13,Premium
390
+ 389,customer389@example.com,Customer 389,Brazil,2024-03-18,Basic
391
+ 390,customer390@example.com,Customer 390,Canada,2024-02-01,Standard
392
+ 391,customer391@example.com,Customer 391,Brazil,2024-08-18,Basic
393
+ 392,customer392@example.com,Customer 392,France,2024-02-22,Basic
394
+ 393,customer393@example.com,Customer 393,UK,2024-06-24,Standard
395
+ 394,customer394@example.com,Customer 394,Germany,2024-12-31,Standard
396
+ 395,customer395@example.com,Customer 395,USA,2024-02-13,Standard
397
+ 396,customer396@example.com,Customer 396,USA,2024-09-15,Standard
398
+ 397,customer397@example.com,Customer 397,UK,2024-11-26,Premium
399
+ 398,customer398@example.com,Customer 398,France,2024-03-29,Standard
400
+ 399,customer399@example.com,Customer 399,France,2024-01-21,Basic
401
+ 400,customer400@example.com,Customer 400,Germany,2024-05-06,Standard
402
+ 401,customer401@example.com,Customer 401,UK,2024-12-28,Standard
403
+ 402,customer402@example.com,Customer 402,USA,2024-08-12,Standard
404
+ 403,customer403@example.com,Customer 403,Germany,2024-08-12,Standard
405
+ 404,customer404@example.com,Customer 404,Brazil,2024-09-25,Standard
406
+ 405,customer405@example.com,Customer 405,Australia,2024-09-24,Basic
407
+ 406,customer406@example.com,Customer 406,USA,2024-11-08,Standard
408
+ 407,customer407@example.com,Customer 407,USA,2024-03-22,Basic
409
+ 408,customer408@example.com,Customer 408,Germany,2024-07-05,Basic
410
+ 409,customer409@example.com,Customer 409,France,2024-07-09,Standard
411
+ 410,customer410@example.com,Customer 410,UK,2024-05-24,Basic
412
+ 411,customer411@example.com,Customer 411,Australia,2024-07-17,Basic
413
+ 412,customer412@example.com,Customer 412,Australia,2024-07-28,Standard
414
+ 413,customer413@example.com,Customer 413,Canada,2024-06-22,Standard
415
+ 414,customer414@example.com,Customer 414,USA,2024-12-13,Standard
416
+ 415,customer415@example.com,Customer 415,USA,2024-11-02,Basic
417
+ 416,customer416@example.com,Customer 416,USA,2024-01-27,Standard
418
+ 417,customer417@example.com,Customer 417,USA,2024-11-19,Basic
419
+ 418,customer418@example.com,Customer 418,Germany,2024-11-27,Standard
420
+ 419,customer419@example.com,Customer 419,Japan,2024-06-20,Basic
421
+ 420,customer420@example.com,Customer 420,USA,2024-02-03,Standard
422
+ 421,customer421@example.com,Customer 421,UK,2024-06-17,Standard
423
+ 422,customer422@example.com,Customer 422,France,2024-02-18,Premium
424
+ 423,customer423@example.com,Customer 423,USA,2024-10-12,Premium
425
+ 424,customer424@example.com,Customer 424,Canada,2024-12-13,Basic
426
+ 425,customer425@example.com,Customer 425,Germany,2024-07-16,Basic
427
+ 426,customer426@example.com,Customer 426,USA,2024-05-25,Basic
428
+ 427,customer427@example.com,Customer 427,France,2024-05-09,Basic
429
+ 428,customer428@example.com,Customer 428,USA,2024-12-02,Standard
430
+ 429,customer429@example.com,Customer 429,Australia,2024-11-04,Basic
431
+ 430,customer430@example.com,Customer 430,Australia,2024-03-17,Standard
432
+ 431,customer431@example.com,Customer 431,USA,2024-06-19,Basic
433
+ 432,customer432@example.com,Customer 432,UK,2024-02-11,Premium
434
+ 433,customer433@example.com,Customer 433,USA,2024-10-25,Standard
435
+ 434,customer434@example.com,Customer 434,Brazil,2024-12-05,Standard
436
+ 435,customer435@example.com,Customer 435,Germany,2024-03-13,Standard
437
+ 436,customer436@example.com,Customer 436,USA,2024-06-28,Basic
438
+ 437,customer437@example.com,Customer 437,USA,2024-06-07,Standard
439
+ 438,customer438@example.com,Customer 438,Japan,2024-12-01,Standard
440
+ 439,customer439@example.com,Customer 439,Germany,2024-12-23,Standard
441
+ 440,customer440@example.com,Customer 440,Australia,2024-12-05,Premium
442
+ 441,customer441@example.com,Customer 441,France,2024-07-19,Standard
443
+ 442,customer442@example.com,Customer 442,Brazil,2024-03-07,Premium
444
+ 443,customer443@example.com,Customer 443,France,2024-10-31,Standard
445
+ 444,customer444@example.com,Customer 444,Brazil,2024-12-28,Standard
446
+ 445,customer445@example.com,Customer 445,Japan,2024-02-13,Basic
447
+ 446,customer446@example.com,Customer 446,France,2024-06-07,Premium
448
+ 447,customer447@example.com,Customer 447,Canada,2024-10-13,Basic
449
+ 448,customer448@example.com,Customer 448,Germany,2024-07-11,Basic
450
+ 449,customer449@example.com,Customer 449,Japan,2024-11-25,Basic
451
+ 450,customer450@example.com,Customer 450,Germany,2024-06-17,Basic
452
+ 451,customer451@example.com,Customer 451,Japan,2024-03-06,Premium
453
+ 452,customer452@example.com,Customer 452,Canada,2024-12-09,Premium
454
+ 453,customer453@example.com,Customer 453,Germany,2024-12-25,Premium
455
+ 454,customer454@example.com,Customer 454,USA,2024-12-16,Standard
456
+ 455,customer455@example.com,Customer 455,USA,2024-09-26,Standard
457
+ 456,customer456@example.com,Customer 456,France,2024-02-17,Basic
458
+ 457,customer457@example.com,Customer 457,Australia,2024-11-26,Standard
459
+ 458,customer458@example.com,Customer 458,Germany,2024-12-09,Standard
460
+ 459,customer459@example.com,Customer 459,France,2024-08-04,Standard
461
+ 460,customer460@example.com,Customer 460,USA,2024-09-17,Standard
462
+ 461,customer461@example.com,Customer 461,USA,2024-07-04,Standard
463
+ 462,customer462@example.com,Customer 462,USA,2024-01-10,Basic
464
+ 463,customer463@example.com,Customer 463,USA,2024-07-04,Standard
465
+ 464,customer464@example.com,Customer 464,UK,2024-06-07,Basic
466
+ 465,customer465@example.com,Customer 465,Germany,2024-04-02,Basic
467
+ 466,customer466@example.com,Customer 466,USA,2024-04-19,Basic
468
+ 467,customer467@example.com,Customer 467,USA,2024-06-23,Basic
469
+ 468,customer468@example.com,Customer 468,Canada,2024-09-05,Basic
470
+ 469,customer469@example.com,Customer 469,Canada,2024-04-08,Premium
471
+ 470,customer470@example.com,Customer 470,USA,2024-04-25,Standard
472
+ 471,customer471@example.com,Customer 471,UK,2024-03-11,Standard
473
+ 472,customer472@example.com,Customer 472,Germany,2024-03-20,Premium
474
+ 473,customer473@example.com,Customer 473,UK,2024-02-09,Premium
475
+ 474,customer474@example.com,Customer 474,USA,2024-05-31,Standard
476
+ 475,customer475@example.com,Customer 475,UK,2024-02-21,Standard
477
+ 476,customer476@example.com,Customer 476,Brazil,2024-09-16,Standard
478
+ 477,customer477@example.com,Customer 477,France,2024-10-03,Basic
479
+ 478,customer478@example.com,Customer 478,Canada,2024-09-26,Standard
480
+ 479,customer479@example.com,Customer 479,Japan,2024-01-20,Basic
481
+ 480,customer480@example.com,Customer 480,Australia,2024-12-04,Premium
482
+ 481,customer481@example.com,Customer 481,UK,2024-06-21,Standard
483
+ 482,customer482@example.com,Customer 482,USA,2024-11-12,Premium
484
+ 483,customer483@example.com,Customer 483,UK,2024-03-08,Standard
485
+ 484,customer484@example.com,Customer 484,Australia,2024-11-01,Basic
486
+ 485,customer485@example.com,Customer 485,Japan,2024-07-11,Basic
487
+ 486,customer486@example.com,Customer 486,Brazil,2024-03-19,Standard
488
+ 487,customer487@example.com,Customer 487,UK,2024-03-24,Premium
489
+ 488,customer488@example.com,Customer 488,Canada,2024-04-02,Premium
490
+ 489,customer489@example.com,Customer 489,Germany,2024-12-20,Basic
491
+ 490,customer490@example.com,Customer 490,France,2024-11-15,Basic
492
+ 491,customer491@example.com,Customer 491,USA,2024-03-25,Standard
493
+ 492,customer492@example.com,Customer 492,USA,2024-08-12,Premium
494
+ 493,customer493@example.com,Customer 493,UK,2024-01-23,Basic
495
+ 494,customer494@example.com,Customer 494,USA,2024-07-29,Standard
496
+ 495,customer495@example.com,Customer 495,UK,2024-07-05,Basic
497
+ 496,customer496@example.com,Customer 496,Canada,2024-12-12,Standard
498
+ 497,customer497@example.com,Customer 497,UK,2024-05-01,Basic
499
+ 498,customer498@example.com,Customer 498,USA,2024-08-15,Basic
500
+ 499,customer499@example.com,Customer 499,Germany,2024-11-08,Standard
501
+ 500,customer500@example.com,Customer 500,USA,2024-05-25,Premium
502
+ 501,customer501@example.com,Customer 501,France,2024-08-17,Standard
503
+ 502,customer502@example.com,Customer 502,USA,2024-04-29,Standard
504
+ 503,customer503@example.com,Customer 503,UK,2024-09-30,Basic
505
+ 504,customer504@example.com,Customer 504,Germany,2024-05-02,Standard
506
+ 505,customer505@example.com,Customer 505,USA,2024-06-07,Basic
507
+ 506,customer506@example.com,Customer 506,France,2024-08-28,Standard
508
+ 507,customer507@example.com,Customer 507,USA,2024-04-09,Basic
509
+ 508,customer508@example.com,Customer 508,Germany,2024-07-07,Premium
510
+ 509,customer509@example.com,Customer 509,USA,2024-12-13,Basic
511
+ 510,customer510@example.com,Customer 510,UK,2024-10-19,Basic
512
+ 511,customer511@example.com,Customer 511,USA,2024-08-13,Standard
513
+ 512,customer512@example.com,Customer 512,UK,2024-08-24,Basic
514
+ 513,customer513@example.com,Customer 513,Australia,2024-05-24,Premium
515
+ 514,customer514@example.com,Customer 514,UK,2024-07-14,Standard
516
+ 515,customer515@example.com,Customer 515,Australia,2024-09-14,Basic
517
+ 516,customer516@example.com,Customer 516,Japan,2024-09-27,Standard
518
+ 517,customer517@example.com,Customer 517,USA,2024-08-02,Basic
519
+ 518,customer518@example.com,Customer 518,USA,2024-03-23,Basic
520
+ 519,customer519@example.com,Customer 519,USA,2024-04-12,Standard
521
+ 520,customer520@example.com,Customer 520,Germany,2024-11-05,Basic
522
+ 521,customer521@example.com,Customer 521,Brazil,2024-03-11,Premium
523
+ 522,customer522@example.com,Customer 522,UK,2024-05-08,Standard
524
+ 523,customer523@example.com,Customer 523,France,2024-01-27,Basic
525
+ 524,customer524@example.com,Customer 524,Australia,2024-11-24,Standard
526
+ 525,customer525@example.com,Customer 525,France,2024-09-03,Standard
527
+ 526,customer526@example.com,Customer 526,Australia,2024-07-09,Basic
528
+ 527,customer527@example.com,Customer 527,Brazil,2024-10-10,Standard
529
+ 528,customer528@example.com,Customer 528,USA,2024-02-22,Basic
530
+ 529,customer529@example.com,Customer 529,USA,2024-12-30,Basic
531
+ 530,customer530@example.com,Customer 530,USA,2024-09-21,Premium
532
+ 531,customer531@example.com,Customer 531,USA,2024-03-04,Standard
533
+ 532,customer532@example.com,Customer 532,France,2024-05-25,Basic
534
+ 533,customer533@example.com,Customer 533,Germany,2024-02-12,Basic
535
+ 534,customer534@example.com,Customer 534,USA,2024-03-23,Premium
536
+ 535,customer535@example.com,Customer 535,Canada,2024-05-19,Standard
537
+ 536,customer536@example.com,Customer 536,Australia,2024-08-18,Basic
538
+ 537,customer537@example.com,Customer 537,USA,2024-09-19,Standard
539
+ 538,customer538@example.com,Customer 538,France,2024-03-16,Basic
540
+ 539,customer539@example.com,Customer 539,Canada,2024-08-11,Standard
541
+ 540,customer540@example.com,Customer 540,USA,2024-02-16,Premium
542
+ 541,customer541@example.com,Customer 541,Australia,2024-04-23,Premium
543
+ 542,customer542@example.com,Customer 542,Brazil,2024-08-18,Standard
544
+ 543,customer543@example.com,Customer 543,USA,2024-06-27,Standard
545
+ 544,customer544@example.com,Customer 544,USA,2024-01-14,Standard
546
+ 545,customer545@example.com,Customer 545,UK,2024-07-31,Premium
547
+ 546,customer546@example.com,Customer 546,Canada,2024-01-28,Standard
548
+ 547,customer547@example.com,Customer 547,Brazil,2024-07-21,Standard
549
+ 548,customer548@example.com,Customer 548,UK,2024-09-14,Standard
550
+ 549,customer549@example.com,Customer 549,Canada,2024-07-10,Standard
551
+ 550,customer550@example.com,Customer 550,USA,2024-04-30,Premium
552
+ 551,customer551@example.com,Customer 551,Canada,2024-07-16,Standard
553
+ 552,customer552@example.com,Customer 552,France,2024-02-11,Premium
554
+ 553,customer553@example.com,Customer 553,USA,2024-07-10,Standard
555
+ 554,customer554@example.com,Customer 554,Australia,2024-04-24,Standard
556
+ 555,customer555@example.com,Customer 555,Japan,2024-01-15,Standard
557
+ 556,customer556@example.com,Customer 556,France,2024-06-12,Standard
558
+ 557,customer557@example.com,Customer 557,USA,2024-02-20,Standard
559
+ 558,customer558@example.com,Customer 558,Brazil,2024-12-31,Premium
560
+ 559,customer559@example.com,Customer 559,Australia,2024-11-28,Basic
561
+ 560,customer560@example.com,Customer 560,UK,2024-06-20,Basic
562
+ 561,customer561@example.com,Customer 561,UK,2024-03-15,Basic
563
+ 562,customer562@example.com,Customer 562,UK,2024-03-11,Standard
564
+ 563,customer563@example.com,Customer 563,Germany,2024-01-20,Standard
565
+ 564,customer564@example.com,Customer 564,UK,2024-05-26,Standard
566
+ 565,customer565@example.com,Customer 565,Japan,2024-08-29,Premium
567
+ 566,customer566@example.com,Customer 566,Australia,2024-12-22,Standard
568
+ 567,customer567@example.com,Customer 567,USA,2024-03-12,Standard
569
+ 568,customer568@example.com,Customer 568,Brazil,2024-12-27,Premium
570
+ 569,customer569@example.com,Customer 569,France,2024-08-28,Standard
571
+ 570,customer570@example.com,Customer 570,Australia,2024-08-17,Standard
572
+ 571,customer571@example.com,Customer 571,Canada,2024-11-11,Standard
573
+ 572,customer572@example.com,Customer 572,UK,2024-01-03,Premium
574
+ 573,customer573@example.com,Customer 573,Canada,2024-02-10,Standard
575
+ 574,customer574@example.com,Customer 574,Brazil,2024-01-10,Standard
576
+ 575,customer575@example.com,Customer 575,USA,2024-05-11,Standard
577
+ 576,customer576@example.com,Customer 576,Australia,2024-04-20,Standard
578
+ 577,customer577@example.com,Customer 577,Germany,2024-03-17,Standard
579
+ 578,customer578@example.com,Customer 578,Germany,2024-10-07,Premium
580
+ 579,customer579@example.com,Customer 579,UK,2024-11-07,Standard
581
+ 580,customer580@example.com,Customer 580,Canada,2024-09-27,Basic
582
+ 581,customer581@example.com,Customer 581,USA,2024-08-04,Standard
583
+ 582,customer582@example.com,Customer 582,Japan,2024-02-26,Standard
584
+ 583,customer583@example.com,Customer 583,Japan,2024-05-27,Basic
585
+ 584,customer584@example.com,Customer 584,USA,2024-05-01,Standard
586
+ 585,customer585@example.com,Customer 585,Japan,2024-06-03,Standard
587
+ 586,customer586@example.com,Customer 586,USA,2024-03-03,Basic
588
+ 587,customer587@example.com,Customer 587,Germany,2024-01-25,Basic
589
+ 588,customer588@example.com,Customer 588,France,2024-05-02,Basic
590
+ 589,customer589@example.com,Customer 589,UK,2024-08-02,Premium
591
+ 590,customer590@example.com,Customer 590,USA,2024-11-23,Standard
592
+ 591,customer591@example.com,Customer 591,Japan,2024-11-14,Basic
593
+ 592,customer592@example.com,Customer 592,USA,2024-08-22,Standard
594
+ 593,customer593@example.com,Customer 593,USA,2024-02-02,Standard
595
+ 594,customer594@example.com,Customer 594,Australia,2024-02-26,Basic
596
+ 595,customer595@example.com,Customer 595,UK,2024-09-12,Basic
597
+ 596,customer596@example.com,Customer 596,Japan,2024-11-01,Standard
598
+ 597,customer597@example.com,Customer 597,Canada,2024-10-01,Basic
599
+ 598,customer598@example.com,Customer 598,USA,2024-01-09,Standard
600
+ 599,customer599@example.com,Customer 599,USA,2024-11-19,Standard
601
+ 600,customer600@example.com,Customer 600,Brazil,2024-09-20,Standard
602
+ 601,customer601@example.com,Customer 601,USA,2024-10-21,Standard
603
+ 602,customer602@example.com,Customer 602,Canada,2024-05-03,Basic
604
+ 603,customer603@example.com,Customer 603,Germany,2024-03-14,Standard
605
+ 604,customer604@example.com,Customer 604,Australia,2024-05-29,Premium
606
+ 605,customer605@example.com,Customer 605,Canada,2024-08-07,Standard
607
+ 606,customer606@example.com,Customer 606,France,2024-01-01,Standard
608
+ 607,customer607@example.com,Customer 607,Germany,2024-11-10,Standard
609
+ 608,customer608@example.com,Customer 608,Australia,2024-06-29,Basic
610
+ 609,customer609@example.com,Customer 609,USA,2024-05-03,Standard
611
+ 610,customer610@example.com,Customer 610,USA,2024-10-19,Basic
612
+ 611,customer611@example.com,Customer 611,Canada,2024-08-01,Standard
613
+ 612,customer612@example.com,Customer 612,UK,2024-04-05,Basic
614
+ 613,customer613@example.com,Customer 613,France,2024-12-06,Standard
615
+ 614,customer614@example.com,Customer 614,Germany,2024-12-08,Standard
616
+ 615,customer615@example.com,Customer 615,Germany,2024-02-13,Basic
617
+ 616,customer616@example.com,Customer 616,UK,2024-09-25,Basic
618
+ 617,customer617@example.com,Customer 617,Canada,2024-07-03,Basic
619
+ 618,customer618@example.com,Customer 618,UK,2024-02-04,Standard
620
+ 619,customer619@example.com,Customer 619,Canada,2024-09-26,Standard
621
+ 620,customer620@example.com,Customer 620,USA,2024-10-05,Standard
622
+ 621,customer621@example.com,Customer 621,USA,2024-09-16,Standard
623
+ 622,customer622@example.com,Customer 622,USA,2024-09-16,Basic
624
+ 623,customer623@example.com,Customer 623,USA,2024-10-10,Basic
625
+ 624,customer624@example.com,Customer 624,USA,2024-01-11,Basic
626
+ 625,customer625@example.com,Customer 625,Germany,2024-07-18,Premium
627
+ 626,customer626@example.com,Customer 626,Australia,2024-08-28,Basic
628
+ 627,customer627@example.com,Customer 627,USA,2024-01-23,Standard
629
+ 628,customer628@example.com,Customer 628,USA,2024-11-21,Standard
630
+ 629,customer629@example.com,Customer 629,Germany,2024-07-17,Standard
631
+ 630,customer630@example.com,Customer 630,Canada,2024-07-10,Basic
632
+ 631,customer631@example.com,Customer 631,Brazil,2024-05-09,Basic
633
+ 632,customer632@example.com,Customer 632,Germany,2024-01-09,Standard
634
+ 633,customer633@example.com,Customer 633,USA,2024-07-01,Basic
635
+ 634,customer634@example.com,Customer 634,USA,2024-02-04,Standard
636
+ 635,customer635@example.com,Customer 635,USA,2024-06-25,Basic
637
+ 636,customer636@example.com,Customer 636,USA,2024-05-03,Standard
638
+ 637,customer637@example.com,Customer 637,USA,2024-12-02,Standard
639
+ 638,customer638@example.com,Customer 638,USA,2024-11-17,Premium
640
+ 639,customer639@example.com,Customer 639,Germany,2024-02-23,Basic
641
+ 640,customer640@example.com,Customer 640,USA,2024-10-24,Basic
642
+ 641,customer641@example.com,Customer 641,Brazil,2024-06-19,Standard
643
+ 642,customer642@example.com,Customer 642,Germany,2024-03-09,Standard
644
+ 643,customer643@example.com,Customer 643,Canada,2024-01-23,Premium
645
+ 644,customer644@example.com,Customer 644,USA,2024-06-29,Basic
646
+ 645,customer645@example.com,Customer 645,Japan,2024-10-06,Basic
647
+ 646,customer646@example.com,Customer 646,Germany,2024-06-22,Standard
648
+ 647,customer647@example.com,Customer 647,Japan,2024-11-25,Basic
649
+ 648,customer648@example.com,Customer 648,France,2024-03-30,Basic
650
+ 649,customer649@example.com,Customer 649,Germany,2024-12-16,Standard
651
+ 650,customer650@example.com,Customer 650,UK,2024-08-25,Premium
652
+ 651,customer651@example.com,Customer 651,USA,2024-12-22,Standard
653
+ 652,customer652@example.com,Customer 652,USA,2024-09-02,Standard
654
+ 653,customer653@example.com,Customer 653,Brazil,2024-11-19,Standard
655
+ 654,customer654@example.com,Customer 654,Germany,2024-04-03,Standard
656
+ 655,customer655@example.com,Customer 655,Australia,2024-03-10,Standard
657
+ 656,customer656@example.com,Customer 656,UK,2024-02-02,Standard
658
+ 657,customer657@example.com,Customer 657,USA,2024-08-22,Standard
659
+ 658,customer658@example.com,Customer 658,France,2024-01-19,Basic
660
+ 659,customer659@example.com,Customer 659,USA,2024-05-30,Standard
661
+ 660,customer660@example.com,Customer 660,USA,2024-04-13,Standard
662
+ 661,customer661@example.com,Customer 661,Germany,2024-01-23,Standard
663
+ 662,customer662@example.com,Customer 662,UK,2024-04-12,Premium
664
+ 663,customer663@example.com,Customer 663,Brazil,2024-01-22,Premium
665
+ 664,customer664@example.com,Customer 664,USA,2024-06-10,Standard
666
+ 665,customer665@example.com,Customer 665,Australia,2024-06-07,Basic
667
+ 666,customer666@example.com,Customer 666,France,2024-09-20,Premium
668
+ 667,customer667@example.com,Customer 667,Australia,2024-07-22,Basic
669
+ 668,customer668@example.com,Customer 668,USA,2024-10-05,Premium
670
+ 669,customer669@example.com,Customer 669,Germany,2024-08-30,Standard
671
+ 670,customer670@example.com,Customer 670,Germany,2024-05-09,Standard
672
+ 671,customer671@example.com,Customer 671,UK,2024-01-19,Standard
673
+ 672,customer672@example.com,Customer 672,Japan,2024-11-27,Standard
674
+ 673,customer673@example.com,Customer 673,Brazil,2024-04-07,Standard
675
+ 674,customer674@example.com,Customer 674,UK,2024-05-26,Standard
676
+ 675,customer675@example.com,Customer 675,France,2024-07-01,Basic
677
+ 676,customer676@example.com,Customer 676,France,2024-01-25,Standard
678
+ 677,customer677@example.com,Customer 677,Canada,2024-12-01,Standard
679
+ 678,customer678@example.com,Customer 678,Brazil,2024-06-18,Basic
680
+ 679,customer679@example.com,Customer 679,USA,2024-05-19,Premium
681
+ 680,customer680@example.com,Customer 680,USA,2024-03-04,Basic
682
+ 681,customer681@example.com,Customer 681,France,2024-07-07,Standard
683
+ 682,customer682@example.com,Customer 682,USA,2024-08-11,Basic
684
+ 683,customer683@example.com,Customer 683,USA,2024-07-23,Standard
685
+ 684,customer684@example.com,Customer 684,USA,2024-08-13,Basic
686
+ 685,customer685@example.com,Customer 685,USA,2024-07-16,Standard
687
+ 686,customer686@example.com,Customer 686,Germany,2024-06-22,Standard
688
+ 687,customer687@example.com,Customer 687,France,2024-04-05,Standard
689
+ 688,customer688@example.com,Customer 688,USA,2024-09-11,Standard
690
+ 689,customer689@example.com,Customer 689,USA,2024-12-20,Basic
691
+ 690,customer690@example.com,Customer 690,Canada,2024-09-11,Standard
692
+ 691,customer691@example.com,Customer 691,Canada,2024-07-07,Standard
693
+ 692,customer692@example.com,Customer 692,Germany,2024-09-22,Standard
694
+ 693,customer693@example.com,Customer 693,Canada,2024-05-16,Standard
695
+ 694,customer694@example.com,Customer 694,Brazil,2024-02-12,Standard
696
+ 695,customer695@example.com,Customer 695,Australia,2024-08-05,Premium
697
+ 696,customer696@example.com,Customer 696,France,2024-02-10,Standard
698
+ 697,customer697@example.com,Customer 697,France,2024-08-08,Standard
699
+ 698,customer698@example.com,Customer 698,Brazil,2024-11-04,Standard
700
+ 699,customer699@example.com,Customer 699,UK,2024-04-02,Standard
701
+ 700,customer700@example.com,Customer 700,Germany,2024-10-06,Basic
702
+ 701,customer701@example.com,Customer 701,France,2024-05-30,Standard
703
+ 702,customer702@example.com,Customer 702,Brazil,2024-06-13,Basic
704
+ 703,customer703@example.com,Customer 703,Australia,2024-02-22,Basic
705
+ 704,customer704@example.com,Customer 704,USA,2024-02-10,Premium
706
+ 705,customer705@example.com,Customer 705,USA,2024-06-16,Premium
707
+ 706,customer706@example.com,Customer 706,UK,2024-12-04,Basic
708
+ 707,customer707@example.com,Customer 707,Canada,2024-05-31,Standard
709
+ 708,customer708@example.com,Customer 708,Germany,2024-06-05,Standard
710
+ 709,customer709@example.com,Customer 709,USA,2024-08-16,Standard
711
+ 710,customer710@example.com,Customer 710,USA,2024-11-04,Standard
712
+ 711,customer711@example.com,Customer 711,Canada,2024-08-06,Basic
713
+ 712,customer712@example.com,Customer 712,Canada,2024-03-26,Standard
714
+ 713,customer713@example.com,Customer 713,Brazil,2024-12-19,Standard
715
+ 714,customer714@example.com,Customer 714,Germany,2024-08-15,Standard
716
+ 715,customer715@example.com,Customer 715,Germany,2024-06-28,Standard
717
+ 716,customer716@example.com,Customer 716,USA,2024-08-16,Standard
718
+ 717,customer717@example.com,Customer 717,USA,2024-01-22,Standard
719
+ 718,customer718@example.com,Customer 718,UK,2024-06-29,Basic
720
+ 719,customer719@example.com,Customer 719,UK,2024-11-10,Standard
721
+ 720,customer720@example.com,Customer 720,USA,2024-08-10,Basic
722
+ 721,customer721@example.com,Customer 721,USA,2024-05-20,Basic
723
+ 722,customer722@example.com,Customer 722,Brazil,2024-11-23,Standard
724
+ 723,customer723@example.com,Customer 723,Japan,2024-01-30,Standard
725
+ 724,customer724@example.com,Customer 724,France,2024-02-08,Premium
726
+ 725,customer725@example.com,Customer 725,Brazil,2024-12-09,Premium
727
+ 726,customer726@example.com,Customer 726,Brazil,2024-11-22,Premium
728
+ 727,customer727@example.com,Customer 727,Canada,2024-07-26,Standard
729
+ 728,customer728@example.com,Customer 728,USA,2024-07-05,Standard
730
+ 729,customer729@example.com,Customer 729,USA,2024-09-19,Basic
731
+ 730,customer730@example.com,Customer 730,Australia,2024-12-13,Standard
732
+ 731,customer731@example.com,Customer 731,Germany,2024-03-22,Standard
733
+ 732,customer732@example.com,Customer 732,France,2024-01-16,Premium
734
+ 733,customer733@example.com,Customer 733,Brazil,2024-03-14,Standard
735
+ 734,customer734@example.com,Customer 734,USA,2024-11-07,Standard
736
+ 735,customer735@example.com,Customer 735,France,2024-12-13,Standard
737
+ 736,customer736@example.com,Customer 736,France,2024-08-12,Basic
738
+ 737,customer737@example.com,Customer 737,Germany,2024-01-18,Standard
739
+ 738,customer738@example.com,Customer 738,USA,2024-03-05,Basic
740
+ 739,customer739@example.com,Customer 739,UK,2024-02-04,Standard
741
+ 740,customer740@example.com,Customer 740,UK,2024-04-30,Standard
742
+ 741,customer741@example.com,Customer 741,Canada,2024-11-26,Premium
743
+ 742,customer742@example.com,Customer 742,Japan,2024-07-06,Standard
744
+ 743,customer743@example.com,Customer 743,UK,2024-07-04,Standard
745
+ 744,customer744@example.com,Customer 744,Canada,2024-07-15,Premium
746
+ 745,customer745@example.com,Customer 745,USA,2024-10-17,Standard
747
+ 746,customer746@example.com,Customer 746,Brazil,2024-01-17,Premium
748
+ 747,customer747@example.com,Customer 747,Australia,2024-11-05,Premium
749
+ 748,customer748@example.com,Customer 748,Germany,2024-03-19,Basic
750
+ 749,customer749@example.com,Customer 749,Germany,2024-12-13,Basic
751
+ 750,customer750@example.com,Customer 750,UK,2024-08-18,Standard
752
+ 751,customer751@example.com,Customer 751,UK,2024-07-08,Standard
753
+ 752,customer752@example.com,Customer 752,Brazil,2024-07-09,Basic
754
+ 753,customer753@example.com,Customer 753,UK,2024-08-15,Standard
755
+ 754,customer754@example.com,Customer 754,Germany,2024-02-09,Basic
756
+ 755,customer755@example.com,Customer 755,Brazil,2024-10-20,Standard
757
+ 756,customer756@example.com,Customer 756,France,2024-03-11,Premium
758
+ 757,customer757@example.com,Customer 757,Germany,2024-09-28,Premium
759
+ 758,customer758@example.com,Customer 758,UK,2024-07-06,Basic
760
+ 759,customer759@example.com,Customer 759,USA,2024-07-22,Standard
761
+ 760,customer760@example.com,Customer 760,UK,2024-06-09,Standard
762
+ 761,customer761@example.com,Customer 761,Australia,2024-11-28,Standard
763
+ 762,customer762@example.com,Customer 762,France,2024-05-22,Standard
764
+ 763,customer763@example.com,Customer 763,Australia,2024-05-07,Standard
765
+ 764,customer764@example.com,Customer 764,USA,2024-02-28,Basic
766
+ 765,customer765@example.com,Customer 765,Germany,2024-01-14,Basic
767
+ 766,customer766@example.com,Customer 766,Brazil,2024-04-05,Standard
768
+ 767,customer767@example.com,Customer 767,UK,2024-09-12,Premium
769
+ 768,customer768@example.com,Customer 768,Canada,2024-09-22,Premium
770
+ 769,customer769@example.com,Customer 769,USA,2024-07-17,Basic
771
+ 770,customer770@example.com,Customer 770,Brazil,2024-10-14,Basic
772
+ 771,customer771@example.com,Customer 771,France,2024-03-01,Standard
773
+ 772,customer772@example.com,Customer 772,USA,2024-05-14,Basic
774
+ 773,customer773@example.com,Customer 773,USA,2024-05-13,Premium
775
+ 774,customer774@example.com,Customer 774,Germany,2024-12-26,Basic
776
+ 775,customer775@example.com,Customer 775,Germany,2024-08-16,Standard
777
+ 776,customer776@example.com,Customer 776,USA,2024-04-19,Basic
778
+ 777,customer777@example.com,Customer 777,Brazil,2024-11-09,Premium
779
+ 778,customer778@example.com,Customer 778,Brazil,2024-05-26,Basic
780
+ 779,customer779@example.com,Customer 779,Germany,2024-12-21,Basic
781
+ 780,customer780@example.com,Customer 780,USA,2024-09-08,Standard
782
+ 781,customer781@example.com,Customer 781,Japan,2024-04-12,Basic
783
+ 782,customer782@example.com,Customer 782,Germany,2024-03-03,Standard
784
+ 783,customer783@example.com,Customer 783,Canada,2024-03-10,Standard
785
+ 784,customer784@example.com,Customer 784,Germany,2024-02-07,Basic
786
+ 785,customer785@example.com,Customer 785,USA,2024-08-19,Standard
787
+ 786,customer786@example.com,Customer 786,Japan,2024-03-29,Basic
788
+ 787,customer787@example.com,Customer 787,Brazil,2024-12-31,Basic
789
+ 788,customer788@example.com,Customer 788,USA,2024-08-15,Standard
790
+ 789,customer789@example.com,Customer 789,Germany,2024-02-14,Basic
791
+ 790,customer790@example.com,Customer 790,UK,2024-12-15,Standard
792
+ 791,customer791@example.com,Customer 791,Brazil,2024-06-12,Standard
793
+ 792,customer792@example.com,Customer 792,Germany,2024-12-07,Basic
794
+ 793,customer793@example.com,Customer 793,Japan,2024-06-26,Standard
795
+ 794,customer794@example.com,Customer 794,Japan,2024-12-29,Standard
796
+ 795,customer795@example.com,Customer 795,USA,2024-02-03,Premium
797
+ 796,customer796@example.com,Customer 796,Australia,2024-10-08,Standard
798
+ 797,customer797@example.com,Customer 797,UK,2024-10-04,Standard
799
+ 798,customer798@example.com,Customer 798,Brazil,2024-05-28,Premium
800
+ 799,customer799@example.com,Customer 799,Germany,2024-06-02,Standard
801
+ 800,customer800@example.com,Customer 800,Australia,2024-03-21,Standard
802
+ 801,customer801@example.com,Customer 801,USA,2024-12-30,Standard
803
+ 802,customer802@example.com,Customer 802,USA,2024-12-29,Standard
804
+ 803,customer803@example.com,Customer 803,France,2024-12-24,Basic
805
+ 804,customer804@example.com,Customer 804,Brazil,2024-11-22,Standard
806
+ 805,customer805@example.com,Customer 805,Germany,2024-03-30,Standard
807
+ 806,customer806@example.com,Customer 806,USA,2024-07-04,Basic
808
+ 807,customer807@example.com,Customer 807,Germany,2024-09-17,Basic
809
+ 808,customer808@example.com,Customer 808,UK,2024-04-24,Basic
810
+ 809,customer809@example.com,Customer 809,Germany,2024-03-03,Premium
811
+ 810,customer810@example.com,Customer 810,Germany,2024-04-12,Basic
812
+ 811,customer811@example.com,Customer 811,Germany,2024-03-12,Basic
813
+ 812,customer812@example.com,Customer 812,UK,2024-05-01,Basic
814
+ 813,customer813@example.com,Customer 813,USA,2024-09-09,Basic
815
+ 814,customer814@example.com,Customer 814,Canada,2024-01-14,Basic
816
+ 815,customer815@example.com,Customer 815,France,2024-07-03,Premium
817
+ 816,customer816@example.com,Customer 816,USA,2024-10-10,Basic
818
+ 817,customer817@example.com,Customer 817,Australia,2024-10-20,Standard
819
+ 818,customer818@example.com,Customer 818,USA,2024-07-07,Basic
820
+ 819,customer819@example.com,Customer 819,Canada,2024-08-27,Basic
821
+ 820,customer820@example.com,Customer 820,Canada,2024-10-09,Basic
822
+ 821,customer821@example.com,Customer 821,Australia,2024-03-07,Basic
823
+ 822,customer822@example.com,Customer 822,UK,2024-11-09,Standard
824
+ 823,customer823@example.com,Customer 823,France,2024-02-14,Standard
825
+ 824,customer824@example.com,Customer 824,Australia,2024-02-03,Standard
826
+ 825,customer825@example.com,Customer 825,Brazil,2024-06-07,Standard
827
+ 826,customer826@example.com,Customer 826,Germany,2024-07-22,Standard
828
+ 827,customer827@example.com,Customer 827,USA,2024-09-02,Standard
829
+ 828,customer828@example.com,Customer 828,Germany,2024-09-26,Basic
830
+ 829,customer829@example.com,Customer 829,France,2024-07-29,Premium
831
+ 830,customer830@example.com,Customer 830,Japan,2024-07-28,Standard
832
+ 831,customer831@example.com,Customer 831,Japan,2024-10-21,Standard
833
+ 832,customer832@example.com,Customer 832,UK,2024-02-07,Basic
834
+ 833,customer833@example.com,Customer 833,Germany,2024-03-05,Standard
835
+ 834,customer834@example.com,Customer 834,Germany,2024-06-11,Basic
836
+ 835,customer835@example.com,Customer 835,Canada,2024-11-24,Standard
837
+ 836,customer836@example.com,Customer 836,UK,2024-02-07,Premium
838
+ 837,customer837@example.com,Customer 837,France,2024-08-18,Basic
839
+ 838,customer838@example.com,Customer 838,USA,2024-08-26,Basic
840
+ 839,customer839@example.com,Customer 839,Germany,2024-12-14,Basic
841
+ 840,customer840@example.com,Customer 840,Brazil,2024-09-21,Standard
842
+ 841,customer841@example.com,Customer 841,UK,2024-06-25,Basic
843
+ 842,customer842@example.com,Customer 842,Canada,2024-03-06,Standard
844
+ 843,customer843@example.com,Customer 843,France,2024-10-09,Premium
845
+ 844,customer844@example.com,Customer 844,Japan,2024-11-23,Standard
846
+ 845,customer845@example.com,Customer 845,Japan,2024-10-27,Standard
847
+ 846,customer846@example.com,Customer 846,Japan,2024-04-03,Standard
848
+ 847,customer847@example.com,Customer 847,UK,2024-03-07,Standard
849
+ 848,customer848@example.com,Customer 848,UK,2024-08-09,Standard
850
+ 849,customer849@example.com,Customer 849,Canada,2024-09-14,Basic
851
+ 850,customer850@example.com,Customer 850,Australia,2024-01-29,Standard
852
+ 851,customer851@example.com,Customer 851,Japan,2024-03-04,Standard
853
+ 852,customer852@example.com,Customer 852,USA,2024-09-22,Standard
854
+ 853,customer853@example.com,Customer 853,USA,2024-03-19,Standard
855
+ 854,customer854@example.com,Customer 854,France,2024-06-04,Standard
856
+ 855,customer855@example.com,Customer 855,Brazil,2024-03-25,Basic
857
+ 856,customer856@example.com,Customer 856,Brazil,2024-03-23,Premium
858
+ 857,customer857@example.com,Customer 857,Canada,2024-06-14,Premium
859
+ 858,customer858@example.com,Customer 858,UK,2024-12-29,Basic
860
+ 859,customer859@example.com,Customer 859,USA,2024-04-25,Standard
861
+ 860,customer860@example.com,Customer 860,France,2024-06-26,Premium
862
+ 861,customer861@example.com,Customer 861,Japan,2024-09-22,Basic
863
+ 862,customer862@example.com,Customer 862,UK,2024-05-25,Standard
864
+ 863,customer863@example.com,Customer 863,Canada,2024-02-10,Premium
865
+ 864,customer864@example.com,Customer 864,Brazil,2024-05-08,Basic
866
+ 865,customer865@example.com,Customer 865,USA,2024-04-10,Standard
867
+ 866,customer866@example.com,Customer 866,Australia,2024-11-21,Basic
868
+ 867,customer867@example.com,Customer 867,USA,2024-10-09,Premium
869
+ 868,customer868@example.com,Customer 868,UK,2024-05-20,Standard
870
+ 869,customer869@example.com,Customer 869,USA,2024-03-05,Standard
871
+ 870,customer870@example.com,Customer 870,Germany,2024-11-16,Basic
872
+ 871,customer871@example.com,Customer 871,Germany,2024-06-04,Standard
873
+ 872,customer872@example.com,Customer 872,Australia,2024-11-10,Basic
874
+ 873,customer873@example.com,Customer 873,USA,2024-09-30,Standard
875
+ 874,customer874@example.com,Customer 874,USA,2024-02-17,Standard
876
+ 875,customer875@example.com,Customer 875,Japan,2024-09-14,Basic
877
+ 876,customer876@example.com,Customer 876,France,2024-11-24,Standard
878
+ 877,customer877@example.com,Customer 877,USA,2024-03-27,Standard
879
+ 878,customer878@example.com,Customer 878,Brazil,2024-10-30,Standard
880
+ 879,customer879@example.com,Customer 879,USA,2024-10-24,Basic
881
+ 880,customer880@example.com,Customer 880,Germany,2024-03-19,Standard
882
+ 881,customer881@example.com,Customer 881,USA,2024-03-28,Basic
883
+ 882,customer882@example.com,Customer 882,USA,2024-12-03,Basic
884
+ 883,customer883@example.com,Customer 883,USA,2024-11-15,Premium
885
+ 884,customer884@example.com,Customer 884,Australia,2024-11-05,Standard
886
+ 885,customer885@example.com,Customer 885,Brazil,2024-06-21,Premium
887
+ 886,customer886@example.com,Customer 886,Canada,2024-10-15,Standard
888
+ 887,customer887@example.com,Customer 887,USA,2024-01-22,Basic
889
+ 888,customer888@example.com,Customer 888,UK,2024-01-15,Premium
890
+ 889,customer889@example.com,Customer 889,UK,2024-02-11,Basic
891
+ 890,customer890@example.com,Customer 890,France,2024-01-24,Basic
892
+ 891,customer891@example.com,Customer 891,France,2024-11-24,Basic
893
+ 892,customer892@example.com,Customer 892,UK,2024-10-22,Standard
894
+ 893,customer893@example.com,Customer 893,USA,2024-05-15,Premium
895
+ 894,customer894@example.com,Customer 894,Japan,2024-11-29,Premium
896
+ 895,customer895@example.com,Customer 895,USA,2024-04-17,Standard
897
+ 896,customer896@example.com,Customer 896,UK,2024-10-19,Basic
898
+ 897,customer897@example.com,Customer 897,Germany,2024-08-01,Premium
899
+ 898,customer898@example.com,Customer 898,USA,2024-11-12,Standard
900
+ 899,customer899@example.com,Customer 899,France,2024-11-23,Basic
901
+ 900,customer900@example.com,Customer 900,France,2024-01-16,Premium
902
+ 901,customer901@example.com,Customer 901,Brazil,2024-09-11,Basic
903
+ 902,customer902@example.com,Customer 902,USA,2024-11-17,Basic
904
+ 903,customer903@example.com,Customer 903,Brazil,2024-10-06,Premium
905
+ 904,customer904@example.com,Customer 904,France,2024-05-28,Basic
906
+ 905,customer905@example.com,Customer 905,USA,2024-11-24,Premium
907
+ 906,customer906@example.com,Customer 906,Germany,2024-06-03,Standard
908
+ 907,customer907@example.com,Customer 907,Canada,2024-09-04,Premium
909
+ 908,customer908@example.com,Customer 908,Canada,2024-05-05,Basic
910
+ 909,customer909@example.com,Customer 909,USA,2024-12-16,Standard
911
+ 910,customer910@example.com,Customer 910,France,2024-07-26,Basic
912
+ 911,customer911@example.com,Customer 911,Germany,2024-06-01,Standard
913
+ 912,customer912@example.com,Customer 912,Brazil,2024-08-20,Standard
914
+ 913,customer913@example.com,Customer 913,USA,2024-02-07,Standard
915
+ 914,customer914@example.com,Customer 914,Australia,2024-12-18,Basic
916
+ 915,customer915@example.com,Customer 915,France,2024-01-31,Basic
917
+ 916,customer916@example.com,Customer 916,UK,2024-03-21,Premium
918
+ 917,customer917@example.com,Customer 917,France,2024-08-13,Premium
919
+ 918,customer918@example.com,Customer 918,France,2024-07-31,Basic
920
+ 919,customer919@example.com,Customer 919,Canada,2024-09-04,Standard
921
+ 920,customer920@example.com,Customer 920,Canada,2024-08-25,Standard
922
+ 921,customer921@example.com,Customer 921,France,2024-04-14,Basic
923
+ 922,customer922@example.com,Customer 922,Japan,2024-06-23,Standard
924
+ 923,customer923@example.com,Customer 923,France,2024-11-06,Premium
925
+ 924,customer924@example.com,Customer 924,Brazil,2024-03-14,Standard
926
+ 925,customer925@example.com,Customer 925,France,2024-06-09,Premium
927
+ 926,customer926@example.com,Customer 926,UK,2024-06-12,Standard
928
+ 927,customer927@example.com,Customer 927,UK,2024-06-25,Standard
929
+ 928,customer928@example.com,Customer 928,France,2024-07-23,Standard
930
+ 929,customer929@example.com,Customer 929,Canada,2024-03-07,Basic
931
+ 930,customer930@example.com,Customer 930,USA,2024-07-08,Basic
932
+ 931,customer931@example.com,Customer 931,USA,2024-09-20,Basic
933
+ 932,customer932@example.com,Customer 932,Canada,2024-10-14,Basic
934
+ 933,customer933@example.com,Customer 933,USA,2024-02-24,Standard
935
+ 934,customer934@example.com,Customer 934,USA,2024-06-12,Standard
936
+ 935,customer935@example.com,Customer 935,Germany,2024-05-03,Standard
937
+ 936,customer936@example.com,Customer 936,Brazil,2024-08-26,Basic
938
+ 937,customer937@example.com,Customer 937,Germany,2024-03-03,Standard
939
+ 938,customer938@example.com,Customer 938,Brazil,2024-05-16,Premium
940
+ 939,customer939@example.com,Customer 939,Japan,2024-08-18,Basic
941
+ 940,customer940@example.com,Customer 940,USA,2024-05-06,Basic
942
+ 941,customer941@example.com,Customer 941,Australia,2024-03-13,Standard
943
+ 942,customer942@example.com,Customer 942,Germany,2024-02-19,Premium
944
+ 943,customer943@example.com,Customer 943,Australia,2024-01-26,Standard
945
+ 944,customer944@example.com,Customer 944,Canada,2024-05-28,Standard
946
+ 945,customer945@example.com,Customer 945,UK,2024-07-15,Standard
947
+ 946,customer946@example.com,Customer 946,USA,2024-11-11,Basic
948
+ 947,customer947@example.com,Customer 947,Brazil,2024-08-02,Basic
949
+ 948,customer948@example.com,Customer 948,USA,2024-05-07,Basic
950
+ 949,customer949@example.com,Customer 949,Brazil,2024-03-22,Premium
951
+ 950,customer950@example.com,Customer 950,Japan,2024-06-16,Basic
952
+ 951,customer951@example.com,Customer 951,Canada,2024-10-22,Standard
953
+ 952,customer952@example.com,Customer 952,Brazil,2024-06-09,Standard
954
+ 953,customer953@example.com,Customer 953,Brazil,2024-04-07,Basic
955
+ 954,customer954@example.com,Customer 954,Australia,2024-03-22,Basic
956
+ 955,customer955@example.com,Customer 955,UK,2024-09-12,Basic
957
+ 956,customer956@example.com,Customer 956,Australia,2024-09-20,Basic
958
+ 957,customer957@example.com,Customer 957,USA,2024-08-27,Premium
959
+ 958,customer958@example.com,Customer 958,Germany,2024-09-12,Premium
960
+ 959,customer959@example.com,Customer 959,Germany,2024-06-06,Standard
961
+ 960,customer960@example.com,Customer 960,Canada,2024-09-11,Premium
962
+ 961,customer961@example.com,Customer 961,Canada,2024-01-12,Premium
963
+ 962,customer962@example.com,Customer 962,France,2024-02-16,Basic
964
+ 963,customer963@example.com,Customer 963,Australia,2024-07-20,Standard
965
+ 964,customer964@example.com,Customer 964,Brazil,2024-09-15,Standard
966
+ 965,customer965@example.com,Customer 965,USA,2024-08-22,Standard
967
+ 966,customer966@example.com,Customer 966,USA,2024-05-03,Standard
968
+ 967,customer967@example.com,Customer 967,USA,2024-04-20,Basic
969
+ 968,customer968@example.com,Customer 968,Japan,2024-10-25,Premium
970
+ 969,customer969@example.com,Customer 969,Germany,2024-06-29,Standard
971
+ 970,customer970@example.com,Customer 970,Brazil,2024-01-25,Standard
972
+ 971,customer971@example.com,Customer 971,USA,2024-01-26,Standard
973
+ 972,customer972@example.com,Customer 972,USA,2024-05-24,Standard
974
+ 973,customer973@example.com,Customer 973,Australia,2024-09-10,Standard
975
+ 974,customer974@example.com,Customer 974,Brazil,2024-11-01,Standard
976
+ 975,customer975@example.com,Customer 975,UK,2024-11-30,Basic
977
+ 976,customer976@example.com,Customer 976,UK,2024-12-10,Standard
978
+ 977,customer977@example.com,Customer 977,USA,2024-08-28,Standard
979
+ 978,customer978@example.com,Customer 978,Brazil,2024-05-26,Standard
980
+ 979,customer979@example.com,Customer 979,UK,2024-10-01,Basic
981
+ 980,customer980@example.com,Customer 980,Germany,2024-01-05,Basic
982
+ 981,customer981@example.com,Customer 981,USA,2024-02-25,Premium
983
+ 982,customer982@example.com,Customer 982,Japan,2024-08-08,Basic
984
+ 983,customer983@example.com,Customer 983,USA,2024-03-09,Basic
985
+ 984,customer984@example.com,Customer 984,Germany,2024-05-15,Basic
986
+ 985,customer985@example.com,Customer 985,Canada,2024-07-06,Premium
987
+ 986,customer986@example.com,Customer 986,Canada,2024-07-25,Premium
988
+ 987,customer987@example.com,Customer 987,Brazil,2024-07-06,Standard
989
+ 988,customer988@example.com,Customer 988,UK,2024-01-24,Standard
990
+ 989,customer989@example.com,Customer 989,Canada,2024-07-24,Standard
991
+ 990,customer990@example.com,Customer 990,USA,2024-01-27,Standard
992
+ 991,customer991@example.com,Customer 991,UK,2024-10-18,Basic
993
+ 992,customer992@example.com,Customer 992,USA,2024-10-14,Basic
994
+ 993,customer993@example.com,Customer 993,Germany,2024-04-09,Premium
995
+ 994,customer994@example.com,Customer 994,UK,2024-07-04,Basic
996
+ 995,customer995@example.com,Customer 995,Brazil,2024-10-10,Basic
997
+ 996,customer996@example.com,Customer 996,USA,2024-05-27,Standard
998
+ 997,customer997@example.com,Customer 997,UK,2024-02-07,Basic
999
+ 998,customer998@example.com,Customer 998,UK,2024-07-16,Standard
1000
+ 999,customer999@example.com,Customer 999,Brazil,2024-09-15,Basic
1001
+ 1000,customer1000@example.com,Customer 1000,Japan,2024-08-18,Basic
data/order_items.csv ADDED
The diff for this file is too large to render. See raw diff
 
data/orders.csv ADDED
The diff for this file is too large to render. See raw diff
 
data/products.csv ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ product_id,name,category,price,cost
2
+ 1,Product 1,Electronics,91.81,51.17
3
+ 2,Product 2,Clothing,72.2,55.89
4
+ 3,Product 3,Home,392.75,66.43
5
+ 4,Product 4,Sports,141.69,161.16
6
+ 5,Product 5,Books,444.34,141.64
7
+ 6,Product 6,Beauty,388.0,148.39
8
+ 7,Product 7,Electronics,24.38,67.02
9
+ 8,Product 8,Clothing,405.48,58.03
10
+ 9,Product 9,Home,143.27,19.56
11
+ 10,Product 10,Sports,41.3,44.53
12
+ 11,Product 11,Books,359.04,157.09
13
+ 12,Product 12,Beauty,292.56,119.02
14
+ 13,Product 13,Electronics,47.76,35.31
15
+ 14,Product 14,Clothing,233.05,37.05
16
+ 15,Product 15,Home,186.46,95.88
17
+ 16,Product 16,Sports,254.81,84.27
18
+ 17,Product 17,Books,287.77,109.51
19
+ 18,Product 18,Beauty,190.17,193.1
20
+ 19,Product 19,Electronics,135.01,45.49
21
+ 20,Product 20,Clothing,60.42,65.12
22
+ 21,Product 21,Home,291.22,56.68
23
+ 22,Product 22,Sports,364.16,28.38
24
+ 23,Product 23,Books,121.92,35.73
25
+ 24,Product 24,Beauty,259.32,138.78
26
+ 25,Product 25,Electronics,31.58,166.15
27
+ 26,Product 26,Clothing,432.83,140.89
28
+ 27,Product 27,Home,129.83,12.86
29
+ 28,Product 28,Sports,241.16,168.01
30
+ 29,Product 29,Books,197.66,68.92
31
+ 30,Product 30,Beauty,83.54,22.79
32
+ 31,Product 31,Electronics,466.27,53.4
33
+ 32,Product 32,Clothing,430.17,74.37
34
+ 33,Product 33,Home,280.9,105.12
35
+ 34,Product 34,Sports,457.83,137.05
36
+ 35,Product 35,Books,372.93,55.73
37
+ 36,Product 36,Beauty,215.49,198.18
38
+ 37,Product 37,Electronics,167.68,11.06
39
+ 38,Product 38,Clothing,213.97,83.86
40
+ 39,Product 39,Home,362.94,93.18
41
+ 40,Product 40,Sports,142.92,150.88
42
+ 41,Product 41,Books,48.16,53.72
43
+ 42,Product 42,Beauty,192.68,95.1
44
+ 43,Product 43,Electronics,256.0,161.76
45
+ 44,Product 44,Clothing,451.95,32.26
46
+ 45,Product 45,Home,97.88,7.33
47
+ 46,Product 46,Sports,404.13,166.92
48
+ 47,Product 47,Books,490.89,196.6
49
+ 48,Product 48,Beauty,477.5,30.49
50
+ 49,Product 49,Electronics,43.77,165.62
51
+ 50,Product 50,Clothing,237.9,77.59
52
+ 51,Product 51,Home,148.33,127.91
53
+ 52,Product 52,Sports,423.97,130.71
54
+ 53,Product 53,Books,170.38,118.55
55
+ 54,Product 54,Beauty,281.01,55.47
56
+ 55,Product 55,Electronics,13.9,163.49
57
+ 56,Product 56,Clothing,108.33,9.25
58
+ 57,Product 57,Home,286.27,17.57
59
+ 58,Product 58,Sports,158.92,180.99
60
+ 59,Product 59,Books,315.13,91.47
61
+ 60,Product 60,Beauty,237.32,30.11
62
+ 61,Product 61,Electronics,299.93,181.49
63
+ 62,Product 62,Clothing,251.75,166.72
64
+ 63,Product 63,Home,388.58,69.65
65
+ 64,Product 64,Sports,105.76,13.33
66
+ 65,Product 65,Books,451.22,94.89
67
+ 66,Product 66,Beauty,382.64,37.76
68
+ 67,Product 67,Electronics,130.11,116.91
69
+ 68,Product 68,Clothing,13.13,165.23
70
+ 69,Product 69,Home,210.92,82.02
71
+ 70,Product 70,Sports,124.17,10.75
72
+ 71,Product 71,Books,179.75,138.23
73
+ 72,Product 72,Beauty,421.39,38.7
74
+ 73,Product 73,Electronics,439.83,46.87
75
+ 74,Product 74,Clothing,475.99,41.49
76
+ 75,Product 75,Home,10.72,59.57
77
+ 76,Product 76,Sports,332.08,177.27
78
+ 77,Product 77,Books,426.01,11.76
79
+ 78,Product 78,Beauty,366.34,125.74
80
+ 79,Product 79,Electronics,60.94,52.93
81
+ 80,Product 80,Clothing,269.61,62.55
82
+ 81,Product 81,Home,126.7,85.34
83
+ 82,Product 82,Sports,251.09,112.38
84
+ 83,Product 83,Books,39.35,16.89
85
+ 84,Product 84,Beauty,498.51,59.56
86
+ 85,Product 85,Electronics,358.71,31.76
87
+ 86,Product 86,Clothing,55.58,43.89
88
+ 87,Product 87,Home,461.42,177.51
89
+ 88,Product 88,Sports,449.67,107.53
90
+ 89,Product 89,Books,264.68,128.0
91
+ 90,Product 90,Beauty,353.41,161.42
92
+ 91,Product 91,Electronics,192.52,160.0
93
+ 92,Product 92,Clothing,487.53,197.93
94
+ 93,Product 93,Home,51.6,157.47
95
+ 94,Product 94,Sports,56.83,75.03
96
+ 95,Product 95,Books,75.42,111.18
97
+ 96,Product 96,Beauty,411.78,99.51
98
+ 97,Product 97,Electronics,46.67,182.97
99
+ 98,Product 98,Clothing,288.23,102.97
100
+ 99,Product 99,Home,223.14,80.73
101
+ 100,Product 100,Sports,482.47,40.06
index.html CHANGED
@@ -1,19 +1,292 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>SQL Query Playground — DuckDB in your browser</title>
7
+ <meta name="description" content="Write and run real SQL against a seeded warehouse — DuckDB compiled to WebAssembly, executed entirely in your browser. 55 tested templates included.">
8
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🦆</text></svg>">
9
+ <style>
10
+ @font-face {
11
+ font-family: "Space Grotesk";
12
+ src: url("https://raw.githubusercontent.com/Reaver1000/sql-query-builder/master/assets/fonts/SpaceGrotesk.woff2") format("woff2");
13
+ font-display: swap;
14
+ }
15
+ :root {
16
+ --bg: #0d1117; --panel: #161b22; --border: #2b3442; --text: #e6edf3;
17
+ --muted: #93a0b4; --accent: #7ee787; --accent2: #79c0ff; --err: #ff7b72;
18
+ }
19
+ * { box-sizing: border-box; }
20
+ body {
21
+ margin: 0; background: var(--bg); color: var(--text);
22
+ font-family: "Space Grotesk", system-ui, sans-serif; letter-spacing: -0.2px;
23
+ }
24
+ header { display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; padding: 18px 22px 0; }
25
+ header h1 { font-size: 1.35rem; margin: 0; letter-spacing: -0.5px; }
26
+ header .tag { color: var(--muted); font-size: .85rem; }
27
+ main { display: grid; grid-template-columns: 280px 1fr; gap: 16px; padding: 16px 22px 30px; }
28
+ aside, section.panel { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; }
29
+ aside { padding: 14px; max-height: 74vh; overflow: auto; }
30
+ aside h2 { font-size: .8rem; text-transform: uppercase; letter-spacing: .8px; color: var(--muted); margin: 4px 0 8px; }
31
+ details { margin-bottom: 6px; }
32
+ summary { cursor: pointer; padding: 7px 10px; border-radius: 8px; background: #1c2330; border: 1px solid var(--border); font-weight: 600; font-size: .9rem; }
33
+ summary:hover { background: #232b3b; }
34
+ .cols { padding: 6px 4px 0 10px; font-size: .78rem; color: var(--muted); line-height: 1.7; }
35
+ .cols b { color: var(--text); font-weight: 600; }
36
+ .cols i { font-style: normal; color: var(--accent2); font-size: .72rem; }
37
+ #templates h2 { margin-top: 16px; }
38
+ .tpl-item { display: block; width: 100%; text-align: left; cursor: pointer; color: var(--text);
39
+ background: none; border: none; font: inherit; font-size: .85rem; padding: 5px 10px 5px 18px; border-radius: 6px; }
40
+ .tpl-item:hover { background: #1f2637; color: var(--accent); }
41
+ .tpl-desc { display: block; font-size: .72rem; color: var(--muted); padding: 0 10px 4px 18px; }
42
+ .editorwrap { padding: 14px; }
43
+ textarea#sql {
44
+ width: 100%; min-height: 180px; resize: vertical; background: #0b0e14; color: #c9e1b8;
45
+ border: 1px solid var(--border); border-radius: 8px; padding: 12px; font-size: .92rem;
46
+ font-family: ui-monospace, "Cascadia Code", Consolas, monospace; line-height: 1.55; outline: none;
47
+ }
48
+ textarea#sql:focus { border-color: var(--accent); }
49
+ .bar { display: flex; gap: 10px; align-items: center; margin: 10px 0 6px; flex-wrap: wrap; }
50
+ button#run { background: var(--accent); color: #04140a; font-weight: 700; border: none; border-radius: 8px;
51
+ padding: 9px 22px; font-size: .95rem; cursor: pointer; font-family: inherit; letter-spacing: -0.3px; }
52
+ button#run:hover { filter: brightness(1.1); }
53
+ button#run:disabled { opacity: .45; cursor: wait; }
54
+ #status { font-size: .82rem; color: var(--muted); }
55
+ #status.ok { color: var(--accent); }
56
+ #status.err { color: var(--err); }
57
+ #errbox { display: none; white-space: pre-wrap; background: rgba(255,123,114,.08); border: 1px solid rgba(255,123,114,.4);
58
+ border-radius: 8px; color: var(--err); padding: 10px 12px; font-size: .82rem; font-family: ui-monospace, Consolas, monospace; margin-top: 8px; }
59
+ .tbl-scroll { max-height: 48vh; overflow: auto; border: 1px solid var(--border); border-radius: 8px; margin-top: 10px; }
60
+ table { border-collapse: collapse; width: 100%; font-size: .8rem; font-family: ui-monospace, Consolas, monospace; }
61
+ th { position: sticky; top: 0; background: #1c2330; color: var(--accent2); text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--border); }
62
+ td { padding: 5px 10px; border-bottom: 1px solid #212938; color: var(--text); white-space: nowrap; }
63
+ td.null { color: #55627a; font-style: italic; }
64
+ tr:hover td { background: #1a2130; }
65
+ .rownote { font-size: .75rem; color: var(--muted); margin-top: 6px; }
66
+ footer { padding: 6px 22px 26px; color: var(--muted); font-size: .8rem; }
67
+ footer a { color: var(--accent2); text-decoration: none; }
68
+ footer a:hover { text-decoration: underline; }
69
+ #boot { position: fixed; inset: 0; display: flex; align-items: center; justify-content: center;
70
+ background: var(--bg); color: var(--muted); font-size: .95rem; z-index: 50; flex-direction: column; gap: 12px; }
71
+ #boot .spinner { width: 28px; height: 28px; border: 3px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin 0.8s linear infinite; }
72
+ @keyframes spin { to { transform: rotate(360deg); } }
73
+ @media (max-width: 900px) { main { grid-template-columns: 1fr; } aside { max-height: none; } }
74
+ </style>
75
+ </head>
76
+ <body>
77
+ <div id="boot"><div class="spinner"></div><div>Loading DuckDB into WebAssembly… (~2.5 MB, then cached)</div></div>
78
+ <header>
79
+ <h1>🦆 SQL Query Playground</h1>
80
+ <span class="tag">55 tested templates · sequential warehouse runs in <i>your</i> browser — nothing is uploaded</span>
81
+ </header>
82
+ <main>
83
+ <aside>
84
+ <div id="schema"><h2>Schema</h2></div>
85
+ <div id="templates"><h2>Template library</h2></div>
86
+ </aside>
87
+ <section class="panel">
88
+ <div class="editorwrap">
89
+ <textarea id="sql" spellcheck="false"></textarea>
90
+ <div class="bar">
91
+ <button id="run" disabled>Run (Ctrl+Enter)</button>
92
+ <span id="status">Booting DuckDB…</span>
93
+ </div>
94
+ <div id="errbox"></div>
95
+ <div class="tbl-scroll" id="resultswrap" hidden><table id="results"></table></div>
96
+ <div class="rownote" id="rownote"></div>
97
+ </div>
98
+ </section>
99
+ </main>
100
+ <footer>
101
+ Data: seeded e-commerce warehouse (1,000 customers · 5,000 orders · 12,663 items) ·
102
+ Templates + code: <a href="https://github.com/Reaver1000/sql-query-builder">github.com/Reaver1000/sql-query-builder</a> ·
103
+ Portfolio: <a href="https://reaver1000.github.io">davidbuchan.dev</a> ·
104
+ Built by <a href="https://www.linkedin.com/in/david-a-buchan/">David Buchan</a>
105
+ </footer>
106
+ <script type="module">
107
+ const $ = (id) => document.getElementById(id);
108
+ const CSV_STATS = { customers: 1000, products: 100, orders: 5000, order_items: 12663 };
109
+
110
+ const STARTER = `-- Top customers by lifetime spend
111
+ SELECT c.name, c.country,
112
+ COUNT(o.order_id) AS orders,
113
+ ROUND(SUM(o.total_amount), 2) AS lifetime_spend
114
+ FROM orders o
115
+ JOIN customers c ON c.customer_id = o.customer_id
116
+ WHERE o.status = 'completed'
117
+ GROUP BY c.name, c.country
118
+ ORDER BY lifetime_spend DESC
119
+ LIMIT 10`;
120
+
121
+ function display(v, tstr) {
122
+ if (v === null || v === undefined) return { s: "NULL", cls: "null" };
123
+ const t = tstr || "";
124
+ if (typeof v === "bigint" && t.startsWith("Timestamp")) {
125
+ let ms = Number(v);
126
+ if (t.includes("Nanosecond")) ms /= 1e6;
127
+ else if (t.includes("Microsecond")) ms /= 1e3;
128
+ else if (t.includes("Second")) ms *= 1000;
129
+ return { s: new Date(ms).toISOString().slice(0, 10), cls: "" };
130
+ }
131
+ if (t.startsWith("Date<")) {
132
+ const ms = t.startsWith("Date<Millisecond") ? Number(v) : Number(v) * 86400000;
133
+ return { s: new Date(ms).toISOString().slice(0, 10), cls: "" };
134
+ }
135
+ if (v instanceof Date) { return { s: v.toISOString().slice(0, 10), cls: "" }; }
136
+ if (typeof v === "bigint") { return { s: v.toLocaleString("en-US"), cls: "" }; }
137
+ if (typeof v === "number") { return { s: Number.isInteger(v) ? v.toLocaleString("en-US") : v.toFixed(2), cls: "" }; }
138
+ return { s: String(v), cls: "" };
139
+ }
140
+
141
+ async function boot() {
142
+ const duckdb = await import("https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@1.33.1-dev57.0/+esm");
143
+ const bundle = await duckdb.selectBundle(duckdb.getJsDelivrBundles());
144
+ const worker = await duckdb.createWorker(bundle.mainWorker);
145
+ const db = new duckdb.AsyncDuckDB(new duckdb.ConsoleLogger(), worker);
146
+ await db.instantiate(bundle.mainModule);
147
+
148
+ for (const name of Object.keys(CSV_STATS)) {
149
+ const resp = await fetch(`data/${name}.csv`);
150
+ if (!resp.ok) { throw new Error(`Missing data file: ${name}.csv (HTTP ${resp.status})`); }
151
+ const buf = new Uint8Array(await resp.arrayBuffer());
152
+ await db.registerFileBuffer(name, buf);
153
+ }
154
+ const conn = await db.connect();
155
+ for (const name of Object.keys(CSV_STATS)) {
156
+ await conn.query(`CREATE TABLE ${name} AS SELECT * FROM read_csv_auto('${name}', header=true)`);
157
+ }
158
+ return { duckdb, db, conn };
159
+ }
160
+
161
+ let conn = null;
162
+
163
+ function describe_table(name, rows) {
164
+ const div = document.createElement("details");
165
+ div.innerHTML = `<summary>${name}</summary>`;
166
+ const cols = document.createElement("div");
167
+ cols.className = "cols";
168
+ cols.innerHTML = rows.map(r => `<div><b>${r[0]}</b> <i>${r[1]}</i></div>`).join("");
169
+ div.appendChild(cols);
170
+ $("schema").appendChild(div);
171
+ }
172
+
173
+ async function buildSchema() {
174
+ for (const name of Object.keys(CSV_STATS)) {
175
+ const res = await conn.query(`DESCRIBE ${name}`);
176
+ const rows = res.toArray().map(o => [o.column_name ?? o["name"], o.column_type ?? o["type"]]);
177
+ describe_table(name, rows);
178
+ }
179
+ }
180
+
181
+ async function buildTemplates() {
182
+ const all = await (await fetch("templates.json")).json();
183
+ const cats = {};
184
+ all.forEach(t => { (cats[t.category] = cats[t.category] || []).push(t); });
185
+ for (const [cat, items] of Object.entries(cats)) {
186
+ const d = document.createElement("details");
187
+ d.open = cat === "Basics";
188
+ const s = document.createElement("summary");
189
+ s.textContent = `${cat} (${items.length})`;
190
+ d.appendChild(s);
191
+ items.forEach(t => {
192
+ const label = document.createElement("span");
193
+ label.className = "tpl-desc";
194
+ label.textContent = t.description || "";
195
+ const b = document.createElement("button");
196
+ b.className = "tpl-item";
197
+ b.textContent = t.name;
198
+ b.addEventListener("click", () => {
199
+ $("sql").value = `-- ${t.description || t.name}\n${t.query}`;
200
+ $("sql").focus();
201
+ run();
202
+ });
203
+ d.appendChild(b);
204
+ d.appendChild(label);
205
+ });
206
+ $("templates").appendChild(d);
207
+ }
208
+ }
209
+
210
+ async function run() {
211
+ const sql = $("sql").value.trim();
212
+ if (!sql || !conn) return;
213
+ const btn = $("run"), st = $("status"), eb = $("errbox");
214
+ btn.disabled = true;
215
+ eb.style.display = "none";
216
+ st.className = "";
217
+ st.textContent = "Executing…";
218
+ $("resultswrap").hidden = true;
219
+ $("rownote").textContent = "";
220
+ const t0 = performance.now();
221
+ try {
222
+ const hsv = sql.replace(/;\s*$/, "");
223
+ const desc = await conn.query(`DESCRIBE SELECT * FROM (${hsv})`);
224
+ const dateCols = desc.toArray()
225
+ .filter(r => r.column_type && /TIMESTAMP|DATE/i.test(r.column_type))
226
+ .map(r => r.column_name);
227
+ let execSql = hsv;
228
+ if (dateCols.length) {
229
+ const casts = dateCols.map(c => {
230
+ const q = `"${c.replace(/"/g, '""')}"`;
231
+ return `CAST(${q} AS VARCHAR) AS ${q}`;
232
+ }).join(", ");
233
+ execSql = `SELECT * REPLACE (${casts}) FROM (${hsv})`;
234
+ }
235
+ const result = await conn.query(execSql);
236
+ const ms = (performance.now() - t0).toFixed(0);
237
+ const rows = result.toArray();
238
+ const types = Object.fromEntries((result.schema.fields || []).map(f => [f.name, String(f.type)]));
239
+ const cols = rows.length ? Object.keys(rows[0]) : (result.schema.fields?.map(f => f.name) || []);
240
+ const head = document.createElement("thead");
241
+ head.innerHTML = "<tr>" + cols.map(c => `<th>${c}</th>`).join("") + "</tr>";
242
+ const body = document.createElement("tbody");
243
+ const CAP = 200;
244
+ rows.slice(0, CAP).forEach(r => {
245
+ const tr = document.createElement("tr");
246
+ tr.innerHTML = cols.map(c => {
247
+ const v = display(r[c], types[c]);
248
+ return `<td class="${v.cls}">${v.s}</td>`;
249
+ }).join("");
250
+ body.appendChild(tr);
251
+ });
252
+ $("results").innerHTML = "";
253
+ if (cols.length) $("results").appendChild(head);
254
+ $("results").appendChild(body);
255
+ $("resultswrap").hidden = false;
256
+ st.className = "ok";
257
+ st.textContent = `✓ ${result.numRows.toLocaleString("en-US")} rows · ${cols.length} cols · ${ms} ms`;
258
+ $("rownote").textContent = rows.length > CAP
259
+ ? `Showing first ${CAP} of ${result.numRows.toLocaleString("en-US")} rows — add a LIMIT to inspect the full result set.`
260
+ : "";
261
+ } catch (e) {
262
+ st.className = "err";
263
+ st.textContent = "✗ Query error";
264
+ eb.style.display = "block";
265
+ eb.textContent = String(e?.message || e).slice(0, 800);
266
+ } finally {
267
+ btn.disabled = false;
268
+ }
269
+ }
270
+
271
+ $("run").addEventListener("click", run);
272
+ $("sql").addEventListener("keydown", (e) => {
273
+ if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) { e.preventDefault(); run(); }
274
+ });
275
+
276
+ $("sql").value = STARTER;
277
+ try {
278
+ const { conn: c } = await boot();
279
+ conn = c;
280
+ await buildSchema();
281
+ await buildTemplates();
282
+ $("boot").remove();
283
+ $("status").textContent = `${Object.values(CSV_STATS).reduce((a, b) => a + b, 0).toLocaleString("en-US")} rows loaded · zero backend`;
284
+ $("status").className = "ok";
285
+ $("run").disabled = false;
286
+ run();
287
+ } catch (e) {
288
+ $("boot").innerHTML = `<div>Failed to load DuckDB: ${String(e?.message || e).slice(0, 200)}</div>`;
289
+ }
290
+ </script>
291
+ </body>
292
  </html>
templates.json ADDED
@@ -0,0 +1 @@
 
 
1
+ [{"category": "Basics", "name": "Peek at a table", "description": "SELECT with LIMIT — always bound your exploratory queries", "query": "SELECT * FROM orders LIMIT 10"}, {"category": "Basics", "name": "Sorting", "description": "Largest completed orders first", "query": "SELECT order_id, customer_id, total_amount, order_date\nFROM orders\nWHERE status = 'completed'\nORDER BY total_amount DESC\nLIMIT 15"}, {"category": "Basics", "name": "Distinct values", "description": "What statuses exist, and how many of each?", "query": "SELECT DISTINCT status FROM orders ORDER BY status"}, {"category": "Basics", "name": "Computed columns", "description": "Margin and margin % from price and cost", "query": "SELECT name, category, price, cost,\n ROUND(price - cost, 2) AS margin,\n ROUND(100.0 * (price - cost) / price, 1) AS margin_pct\nFROM products\nORDER BY margin_pct DESC\nLIMIT 15"}, {"category": "Basics", "name": "Row counts per table", "description": "UNION ALL to stack per-table counts", "query": "SELECT 'customers' AS table_name, COUNT(*) AS rows FROM customers\nUNION ALL SELECT 'products', COUNT(*) FROM products\nUNION ALL SELECT 'orders', COUNT(*) FROM orders\nUNION ALL SELECT 'order_items', COUNT(*) FROM order_items"}, {"category": "Basics", "name": "Random sample", "description": "DuckDB's USING SAMPLE for quick data inspection", "query": "SELECT * FROM customers USING SAMPLE 10 ROWS"}, {"category": "Filtering", "name": "Combining conditions", "description": "AND/OR with explicit parentheses", "query": "SELECT order_id, total_amount, payment_method\nFROM orders\nWHERE status = 'completed'\n AND (payment_method = 'credit_card' OR payment_method = 'paypal')\n AND total_amount > 400\nORDER BY total_amount DESC\nLIMIT 15"}, {"category": "Filtering", "name": "IN lists", "description": "Membership tests instead of chained ORs", "query": "SELECT country, COUNT(*) AS customers\nFROM customers\nWHERE country IN ('UK', 'Germany', 'France')\nGROUP BY country\nORDER BY customers DESC"}, {"category": "Filtering", "name": "Date ranges", "description": "BETWEEN on timestamps — Q1 2024 orders", "query": "SELECT COUNT(*) AS q1_orders, ROUND(SUM(total_amount), 2) AS q1_revenue\nFROM orders\nWHERE order_date BETWEEN '2024-01-01' AND '2024-03-31 23:59:59'\n AND status = 'completed'"}, {"category": "Filtering", "name": "Pattern matching", "description": "LIKE with wildcards", "query": "SELECT email, name\nFROM customers\nWHERE email LIKE 'customer1__@%'\nORDER BY email\nLIMIT 15"}, {"category": "Filtering", "name": "Anti-join: customers with no orders", "description": "NOT EXISTS — the reliable way to find missing relationships", "query": "SELECT c.customer_id, c.name, c.country\nFROM customers c\nWHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id)\nORDER BY c.customer_id\nLIMIT 20"}, {"category": "Filtering", "name": "CASE bucketing", "description": "Label rows into bands, then count the bands", "query": "SELECT CASE\n WHEN total_amount < 100 THEN 'small'\n WHEN total_amount < 300 THEN 'medium'\n ELSE 'large'\n END AS order_size,\n COUNT(*) AS orders,\n ROUND(AVG(total_amount), 2) AS avg_amount\nFROM orders\nGROUP BY 1\nORDER BY avg_amount"}, {"category": "Joins", "name": "Inner join", "description": "Order lines with product names and categories", "query": "SELECT oi.order_id, p.name, p.category, oi.quantity, oi.unit_price\nFROM order_items oi\nJOIN products p ON p.product_id = oi.product_id\nORDER BY oi.order_id\nLIMIT 15"}, {"category": "Joins", "name": "Left join with zero-fill", "description": "Every customer, including the ones who never ordered", "query": "SELECT c.customer_id, c.name,\n COUNT(o.order_id) AS orders,\n COALESCE(ROUND(SUM(o.total_amount), 2), 0) AS total_spend\nFROM customers c\nLEFT JOIN orders o ON o.customer_id = c.customer_id AND o.status = 'completed'\nGROUP BY 1, 2\nORDER BY total_spend ASC\nLIMIT 15"}, {"category": "Joins", "name": "Four-table join", "description": "Country × category revenue through the full schema", "query": "SELECT c.country, p.category,\n ROUND(SUM(oi.quantity * oi.unit_price), 2) AS revenue\nFROM customers c\nJOIN orders o ON o.customer_id = c.customer_id\nJOIN order_items oi ON oi.order_id = o.order_id\nJOIN products p ON p.product_id = oi.product_id\nWHERE o.status = 'completed'\nGROUP BY 1, 2\nORDER BY revenue DESC\nLIMIT 20"}, {"category": "Joins", "name": "Self join", "description": "Similar-priced products within the same category", "query": "SELECT a.category, a.name AS product_a, b.name AS product_b,\n a.price AS price_a, b.price AS price_b\nFROM products a\nJOIN products b ON a.category = b.category\n AND a.product_id < b.product_id\n AND ABS(a.price - b.price) < 5\nORDER BY a.category, a.price\nLIMIT 15"}, {"category": "Joins", "name": "Semi join (EXISTS)", "description": "Customers who have at least one refunded order", "query": "SELECT c.customer_id, c.name, c.segment\nFROM customers c\nWHERE EXISTS (\n SELECT 1 FROM orders o\n WHERE o.customer_id = c.customer_id AND o.status = 'refunded'\n)\nORDER BY c.customer_id\nLIMIT 20"}, {"category": "Joins", "name": "Date spine", "description": "generate_series + LEFT JOIN so days without orders still appear", "query": "SELECT spine.day, COALESCE(ROUND(SUM(o.total_amount), 2), 0) AS revenue\nFROM generate_series(DATE '2024-01-01', DATE '2024-01-14', INTERVAL 1 DAY) AS spine(day)\nLEFT JOIN orders o\n ON CAST(o.order_date AS DATE) = spine.day AND o.status = 'completed'\nGROUP BY spine.day\nORDER BY spine.day"}, {"category": "Joins", "name": "Join vs join-with-filter", "description": "Filter inside the ON clause keeps unmatched rows", "query": "SELECT c.segment,\n COUNT(DISTINCT c.customer_id) AS all_customers,\n COUNT(DISTINCT o.customer_id) AS crypto_payers\nFROM customers c\nLEFT JOIN orders o ON o.customer_id = c.customer_id AND o.payment_method = 'crypto'\nGROUP BY 1\nORDER BY all_customers DESC"}, {"category": "Aggregation", "name": "GROUP BY + HAVING", "description": "HAVING filters groups after aggregation", "query": "SELECT country, COUNT(*) AS customers\nFROM customers\nGROUP BY country\nHAVING COUNT(*) > 100\nORDER BY customers DESC"}, {"category": "Aggregation", "name": "The full aggregate set", "description": "COUNT/SUM/AVG/MIN/MAX in one pass", "query": "SELECT status,\n COUNT(*) AS orders,\n ROUND(SUM(total_amount), 2) AS revenue,\n ROUND(AVG(total_amount), 2) AS avg_value,\n MIN(total_amount) AS smallest,\n MAX(total_amount) AS largest\nFROM orders\nGROUP BY status\nORDER BY revenue DESC"}, {"category": "Aggregation", "name": "Conditional aggregation (FILTER)", "description": "Pivot statuses into columns without a PIVOT clause", "query": "SELECT payment_method,\n COUNT(*) FILTER (WHERE status = 'completed') AS completed,\n COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled,\n COUNT(*) FILTER (WHERE status = 'refunded') AS refunded\nFROM orders\nGROUP BY 1\nORDER BY completed DESC"}, {"category": "Aggregation", "name": "ROLLUP subtotals", "description": "Per-group rows plus subtotal and grand-total rows", "query": "SELECT c.country, c.segment, ROUND(SUM(o.total_amount), 2) AS revenue\nFROM customers c\nJOIN orders o ON o.customer_id = c.customer_id\nWHERE o.status = 'completed'\nGROUP BY ROLLUP (c.country, c.segment)\nORDER BY c.country NULLS LAST, c.segment NULLS LAST"}, {"category": "Aggregation", "name": "Median and percentiles", "description": "PERCENTILE_CONT for distribution shape, not just averages", "query": "SELECT status,\n ROUND(AVG(total_amount), 2) AS mean,\n PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total_amount) AS median,\n PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY total_amount) AS p90\nFROM orders\nGROUP BY status"}, {"category": "Aggregation", "name": "String aggregation", "description": "STRING_AGG collapses a group into one readable cell", "query": "SELECT oi.order_id,\n STRING_AGG(DISTINCT p.category, ', ' ORDER BY p.category) AS categories_in_order\nFROM order_items oi\nJOIN products p ON p.product_id = oi.product_id\nGROUP BY oi.order_id\nORDER BY oi.order_id\nLIMIT 12"}, {"category": "Aggregation", "name": "Distinct counts", "description": "COUNT(DISTINCT ...) — unique buyers per payment method", "query": "SELECT payment_method,\n COUNT(*) AS orders,\n COUNT(DISTINCT customer_id) AS unique_buyers\nFROM orders\nGROUP BY 1\nORDER BY orders DESC"}, {"category": "Date & Time", "name": "Monthly revenue", "description": "DATE_TRUNC is the workhorse of time-series SQL", "query": "SELECT DATE_TRUNC('month', order_date) AS month,\n COUNT(*) AS orders,\n ROUND(SUM(total_amount), 2) AS revenue\nFROM orders\nWHERE status = 'completed'\nGROUP BY 1\nORDER BY 1"}, {"category": "Date & Time", "name": "Day-of-week pattern", "description": "Which weekdays sell the most?", "query": "SELECT DAYNAME(order_date) AS weekday,\n COUNT(*) AS orders,\n ROUND(AVG(total_amount), 2) AS avg_value\nFROM orders\nGROUP BY weekday, DAYOFWEEK(order_date)\nORDER BY DAYOFWEEK(order_date)"}, {"category": "Date & Time", "name": "Hour-of-day distribution", "description": "EXTRACT pulls any date part", "query": "SELECT EXTRACT(hour FROM order_date) AS hour, COUNT(*) AS orders\nFROM orders\nGROUP BY 1\nORDER BY 1"}, {"category": "Date & Time", "name": "Signup-to-first-order gap", "description": "DATE_DIFF between two event dates per customer", "query": "SELECT c.customer_id, c.created_at,\n MIN(o.order_date) AS first_order,\n DATE_DIFF('day', c.created_at, MIN(o.order_date)) AS days_to_first_order\nFROM customers c\nJOIN orders o ON o.customer_id = c.customer_id\nGROUP BY 1, 2\nHAVING DATE_DIFF('day', c.created_at, MIN(o.order_date)) >= 0\nORDER BY days_to_first_order\nLIMIT 15"}, {"category": "Date & Time", "name": "Quarterly summary", "description": "QUARTER() for coarse-grained reporting", "query": "SELECT QUARTER(order_date) AS quarter,\n COUNT(*) AS orders,\n ROUND(SUM(total_amount), 2) AS revenue\nFROM orders\nWHERE status = 'completed'\nGROUP BY 1\nORDER BY 1"}, {"category": "Date & Time", "name": "Signup cohort sizes", "description": "Customers grouped by signup month", "query": "SELECT DATE_TRUNC('month', created_at) AS signup_month,\n COUNT(*) AS new_customers,\n SUM(COUNT(*)) OVER (ORDER BY DATE_TRUNC('month', created_at)) AS running_total\nFROM customers\nGROUP BY 1\nORDER BY 1"}, {"category": "Window Functions", "name": "Latest order per customer", "description": "ROW_NUMBER + QUALIFY to keep one row per group", "query": "SELECT customer_id, order_id, order_date, total_amount\nFROM orders\nQUALIFY ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) = 1\nORDER BY customer_id\nLIMIT 20"}, {"category": "Window Functions", "name": "Product rank within category", "description": "RANK and DENSE_RANK compared side by side", "query": "SELECT p.category, p.name,\n SUM(oi.quantity * oi.unit_price) AS revenue,\n RANK() OVER (PARTITION BY p.category ORDER BY SUM(oi.quantity * oi.unit_price) DESC) AS rnk,\n DENSE_RANK() OVER (PARTITION BY p.category ORDER BY SUM(oi.quantity * oi.unit_price) DESC) AS dense_rnk\nFROM products p\nJOIN order_items oi ON oi.product_id = p.product_id\nGROUP BY p.category, p.name\nQUALIFY rnk <= 3\nORDER BY p.category, rnk"}, {"category": "Window Functions", "name": "Running revenue total", "description": "Cumulative sum over ordered daily revenue", "query": "WITH daily AS (\n SELECT CAST(order_date AS DATE) AS day, SUM(total_amount) AS revenue\n FROM orders WHERE status = 'completed' GROUP BY 1\n)\nSELECT day, revenue,\n SUM(revenue) OVER (ORDER BY day) AS cumulative_revenue\nFROM daily\nORDER BY day\nLIMIT 31"}, {"category": "Window Functions", "name": "7-day moving average", "description": "Window frame: ROWS BETWEEN 6 PRECEDING AND CURRENT ROW", "query": "WITH daily AS (\n SELECT CAST(order_date AS DATE) AS day, SUM(total_amount) AS revenue\n FROM orders WHERE status = 'completed' GROUP BY 1\n)\nSELECT day, revenue,\n ROUND(AVG(revenue) OVER (ORDER BY day ROWS BETWEEN 6 PRECEDING AND CURRENT ROW), 2) AS ma_7d\nFROM daily\nORDER BY day\nLIMIT 31"}, {"category": "Window Functions", "name": "Month-over-month growth", "description": "LAG to compare each month with the previous one", "query": "WITH monthly AS (\n SELECT DATE_TRUNC('month', order_date) AS month, SUM(total_amount) AS revenue\n FROM orders WHERE status = 'completed' GROUP BY 1\n)\nSELECT month, revenue,\n LAG(revenue) OVER (ORDER BY month) AS prev_month,\n ROUND(100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))\n / NULLIF(LAG(revenue) OVER (ORDER BY month), 0), 1) AS growth_pct\nFROM monthly\nORDER BY month"}, {"category": "Window Functions", "name": "Customer spend quartiles", "description": "NTILE(4) buckets customers by total spend", "query": "WITH spend AS (\n SELECT customer_id, SUM(total_amount) AS total_spend\n FROM orders WHERE status = 'completed' GROUP BY 1\n), tiled AS (\n SELECT customer_id, total_spend,\n NTILE(4) OVER (ORDER BY total_spend) AS quartile\n FROM spend\n)\nSELECT quartile,\n COUNT(*) AS customers,\n ROUND(MIN(total_spend), 2) AS min_spend,\n ROUND(AVG(total_spend), 2) AS avg_spend,\n ROUND(MAX(total_spend), 2) AS max_spend\nFROM tiled\nGROUP BY quartile\nORDER BY quartile"}, {"category": "Window Functions", "name": "Share of total revenue", "description": "SUM() OVER () with no partition = grand total", "query": "SELECT p.category,\n SUM(oi.quantity * oi.unit_price) AS revenue,\n ROUND(100.0 * SUM(oi.quantity * oi.unit_price) / SUM(SUM(oi.quantity * oi.unit_price)) OVER (), 1) AS pct_of_total\nFROM products p\nJOIN order_items oi ON oi.product_id = p.product_id\nGROUP BY p.category\nORDER BY revenue DESC"}, {"category": "Window Functions", "name": "First and latest order per customer", "description": "MIN/MAX as window functions preserve detail rows", "query": "SELECT DISTINCT customer_id,\n MIN(order_date) OVER (PARTITION BY customer_id) AS first_order,\n MAX(order_date) OVER (PARTITION BY customer_id) AS latest_order\nFROM orders\nORDER BY customer_id\nLIMIT 20"}, {"category": "CTEs & Subqueries", "name": "CTE: high-value customers", "description": "Name an intermediate result, then join against it", "query": "WITH big_spenders AS (\n SELECT customer_id, SUM(total_amount) AS spend\n FROM orders WHERE status = 'completed'\n GROUP BY 1\n HAVING SUM(total_amount) > 1500\n)\nSELECT c.name, c.country, c.segment, b.spend\nFROM big_spenders b\nJOIN customers c ON c.customer_id = b.customer_id\nORDER BY b.spend DESC\nLIMIT 20"}, {"category": "CTEs & Subqueries", "name": "Multi-CTE funnel", "description": "Chained CTEs: base revenue → country totals → top 3", "query": "WITH completed AS (\n SELECT * FROM orders WHERE status = 'completed'\n), by_country AS (\n SELECT c.country, SUM(o.total_amount) AS revenue\n FROM completed o JOIN customers c ON c.customer_id = o.customer_id\n GROUP BY 1\n)\nSELECT * FROM by_country ORDER BY revenue DESC LIMIT 3"}, {"category": "CTEs & Subqueries", "name": "Orders above the customer's own average", "description": "Correlated subquery — re-evaluated per outer row", "query": "SELECT o.customer_id, o.order_id, o.total_amount\nFROM orders o\nWHERE o.status = 'completed'\n AND o.total_amount > 1.8 * (\n SELECT AVG(o2.total_amount) FROM orders o2\n WHERE o2.customer_id = o.customer_id AND o2.status = 'completed'\n )\nORDER BY o.total_amount DESC\nLIMIT 20"}, {"category": "CTEs & Subqueries", "name": "Orders vs global average", "description": "Scalar subquery used inline in an expression", "query": "SELECT order_id, total_amount,\n ROUND(total_amount - (SELECT AVG(total_amount) FROM orders WHERE status = 'completed'), 2) AS vs_avg\nFROM orders\nWHERE status = 'completed'\nORDER BY vs_avg DESC\nLIMIT 15"}, {"category": "CTEs & Subqueries", "name": "Recursive CTE: month spine", "description": "WITH RECURSIVE generating the 12 months of 2024", "query": "WITH RECURSIVE months(month_start) AS (\n SELECT DATE '2024-01-01'\n UNION ALL\n SELECT month_start + INTERVAL 1 MONTH FROM months\n WHERE month_start < DATE '2024-12-01'\n)\nSELECT m.month_start,\n COALESCE(SUM(o.total_amount), 0) AS revenue\nFROM months m\nLEFT JOIN orders o\n ON DATE_TRUNC('month', o.order_date) = m.month_start AND o.status = 'completed'\nGROUP BY 1\nORDER BY 1"}, {"category": "CTEs & Subqueries", "name": "IN with a subquery", "description": "Customers from the single top revenue country", "query": "SELECT name, email, segment\nFROM customers\nWHERE country IN (\n SELECT c.country\n FROM customers c JOIN orders o ON o.customer_id = c.customer_id\n WHERE o.status = 'completed'\n GROUP BY c.country\n ORDER BY SUM(o.total_amount) DESC\n LIMIT 1\n)\nLIMIT 20"}, {"category": "Business Analytics", "name": "Pareto (80/20) analysis", "description": "Cumulative revenue share — how few products drive most revenue", "query": "WITH product_revenue AS (\n SELECT p.name, SUM(oi.quantity * oi.unit_price) AS revenue\n FROM products p JOIN order_items oi ON oi.product_id = p.product_id\n GROUP BY 1\n)\nSELECT name, revenue,\n ROUND(100.0 * SUM(revenue) OVER (ORDER BY revenue DESC) / SUM(revenue) OVER (), 1) AS cumulative_pct\nFROM product_revenue\nORDER BY revenue DESC\nLIMIT 25"}, {"category": "Business Analytics", "name": "RFM scores", "description": "Recency / Frequency / Monetary quintiles per customer", "query": "WITH per_customer AS (\n SELECT customer_id,\n MAX(order_date) AS last_order,\n COUNT(*) AS frequency,\n SUM(total_amount) AS monetary\n FROM orders WHERE status = 'completed'\n GROUP BY 1\n)\nSELECT customer_id,\n NTILE(5) OVER (ORDER BY last_order) AS r_score,\n NTILE(5) OVER (ORDER BY frequency) AS f_score,\n NTILE(5) OVER (ORDER BY monetary) AS m_score,\n frequency, ROUND(monetary, 2) AS monetary\nFROM per_customer\nORDER BY monetary DESC\nLIMIT 20"}, {"category": "Business Analytics", "name": "Cohort retention", "description": "Signup cohort vs months-to-order matrix (FILTER pivots)", "query": "WITH cohorts AS (\n SELECT c.customer_id, DATE_TRUNC('month', c.created_at) AS cohort_month\n FROM customers c\n), activity AS (\n SELECT ch.cohort_month,\n DATE_DIFF('month', ch.cohort_month, DATE_TRUNC('month', o.order_date)) AS month_offset,\n o.customer_id\n FROM cohorts ch JOIN orders o ON o.customer_id = ch.customer_id\n WHERE o.status = 'completed'\n)\nSELECT cohort_month,\n COUNT(DISTINCT customer_id) FILTER (WHERE month_offset = 0) AS m0,\n COUNT(DISTINCT customer_id) FILTER (WHERE month_offset = 1) AS m1,\n COUNT(DISTINCT customer_id) FILTER (WHERE month_offset = 2) AS m2,\n COUNT(DISTINCT customer_id) FILTER (WHERE month_offset = 3) AS m3\nFROM activity\nGROUP BY 1\nORDER BY 1"}, {"category": "Business Analytics", "name": "Repeat purchase rate", "description": "Share of customers with two or more completed orders", "query": "WITH order_counts AS (\n SELECT customer_id, COUNT(*) AS n\n FROM orders WHERE status = 'completed'\n GROUP BY 1\n)\nSELECT COUNT(*) AS buyers,\n COUNT(*) FILTER (WHERE n >= 2) AS repeat_buyers,\n ROUND(100.0 * COUNT(*) FILTER (WHERE n >= 2) / COUNT(*), 1) AS repeat_rate_pct\nFROM order_counts"}, {"category": "Business Analytics", "name": "Average order value trend", "description": "Monthly AOV with order counts for context", "query": "SELECT DATE_TRUNC('month', order_date) AS month,\n COUNT(*) AS orders,\n ROUND(AVG(total_amount), 2) AS avg_order_value\nFROM orders\nWHERE status = 'completed'\nGROUP BY 1\nORDER BY 1"}, {"category": "Business Analytics", "name": "Revenue per customer by segment", "description": "A simple lifetime-value proxy per segment", "query": "SELECT c.segment,\n COUNT(DISTINCT c.customer_id) AS customers,\n ROUND(SUM(o.total_amount), 2) AS revenue,\n ROUND(SUM(o.total_amount) / COUNT(DISTINCT c.customer_id), 2) AS revenue_per_customer\nFROM customers c\nJOIN orders o ON o.customer_id = c.customer_id AND o.status = 'completed'\nGROUP BY 1\nORDER BY revenue_per_customer DESC"}, {"category": "Business Analytics", "name": "Products bought together", "description": "Market-basket pairs via a self join on order_id", "query": "SELECT p1.name AS product_a, p2.name AS product_b, COUNT(*) AS times_together\nFROM order_items a\nJOIN order_items b ON a.order_id = b.order_id AND a.product_id < b.product_id\nJOIN products p1 ON p1.product_id = a.product_id\nJOIN products p2 ON p2.product_id = b.product_id\nGROUP BY 1, 2\nORDER BY times_together DESC\nLIMIT 10"}, {"category": "Business Analytics", "name": "Refund rate by category", "description": "Conditional aggregation across joined tables", "query": "SELECT p.category,\n COUNT(DISTINCT o.order_id) AS orders,\n COUNT(DISTINCT o.order_id) FILTER (WHERE o.status = 'refunded') AS refunded,\n ROUND(100.0 * COUNT(DISTINCT o.order_id) FILTER (WHERE o.status = 'refunded')\n / COUNT(DISTINCT o.order_id), 2) AS refund_rate_pct\nFROM orders o\nJOIN order_items oi ON oi.order_id = o.order_id\nJOIN products p ON p.product_id = oi.product_id\nGROUP BY 1\nORDER BY refund_rate_pct DESC"}, {"category": "Business Analytics", "name": "New vs returning revenue", "description": "Classify each order against the customer's first order month", "query": "WITH firsts AS (\n SELECT customer_id, MIN(DATE_TRUNC('month', order_date)) AS first_month\n FROM orders WHERE status = 'completed' GROUP BY 1\n)\nSELECT DATE_TRUNC('month', o.order_date) AS month,\n ROUND(SUM(o.total_amount) FILTER (WHERE DATE_TRUNC('month', o.order_date) = f.first_month), 2) AS new_customer_revenue,\n ROUND(SUM(o.total_amount) FILTER (WHERE DATE_TRUNC('month', o.order_date) > f.first_month), 2) AS returning_revenue\nFROM orders o\nJOIN firsts f ON f.customer_id = o.customer_id\nWHERE o.status = 'completed'\nGROUP BY 1\nORDER BY 1"}]