如何在 MySQL 5.7 中使用变量按功能类型实现分区
How to achieve partition by kind of functionality using variables in MySQL 5.7
我使用的是 MySQL 的旧版本。由于某些强有力的原因,我无法升级它。我有一个只有 2 列的 table PatientAppointment。这是 table:
+---------------------+-----------------+
| dateOfCheckup | duration |
+---------------------+-----------------+
| 2020-05-28 | 30 min |
| 2020-05-29 | 30 min |
| 2020-05-30 | 1 hour |
| 2020-06-03 | 1 hour |
| 2020-06-05 | 1 hour 30 min |
| 2020-07-21 | 1 hour 30 min |
| 2020-07-22 | 1 hour |
| 2020-07-28 | 30 min |
+---------------------+-----------------+
我想要 5 样东西:
- 在运行时从 dateOfCheckup
创建一个新列 monthOfCheckup
- 将持续时间转换为整数字段分钟
- 每个月(不是日期)累计 总数
我通过这个查询实现了这 3 点:
select
dateOfCheckup,
duration,
@cur_dur := ((case when duration like '% hour%' then substring_index(duration, ' hour', 1) * 60 else 0 end) +
(case when duration like '%min%' then substring_index(substring_index(duration, ' min', 1), ' ', -1) + 0 else 0 end)) as minutes,
CASE WHEN @year_month = date_format(dateOfCheckup, '%Y-%m')
THEN @cum_sum := @cum_sum + @cur_dur
ELSE @cum_sum := @cur_dur
END total,
@year_month := date_format(dateOfCheckup, '%Y-%m') monthOfCheckup
from patient, (SELECT @year_month:='', @cum_sum:=0, @cur_dur:=0) variables
ORDER BY dateOfCheckup
这是相同的 fiddle。
现在剩下的2分是:
- BillElig1 这可以是布尔值或文本,无关紧要。如果那个特定月份的 总数 是 >=20
,我只需要输入 'Y'
- BillElig2 这可以是布尔值或文本,无关紧要。如果那个特定月份的 总数 是 >=40
,我只需要输入 'Y'
这2点你可以看这个fiddle.
请帮帮我。
再次使用 UDV。
SELECT dateOfCheckup,
duration,
minutes,
CASE WHEN @prev_month != monthOfCheckup
THEN total >= 20
WHEN @prev_total < 20
THEN 1
ELSE 0
END 99457Elig,
CASE WHEN @prev_month != monthOfCheckup
THEN total >= 40
WHEN @prev_total < 40
THEN 1
ELSE 0
END 99458Elig,
@prev_month := monthOfCheckup monthOfCheckup,
@prev_total := total total
FROM (select dateOfCheckup,
duration,
@cur_dur := ((case when duration like '% hour%' then substring_index(duration, ' hour', 1) * 60 else 0 end) +
(case when duration like '%min%' then substring_index(substring_index(duration, ' min', 1), ' ', -1) + 0 else 0 end)) as minutes,
CASE WHEN @year_month = date_format(dateOfCheckup, '%Y-%m')
THEN @cum_sum := @cum_sum + @cur_dur
ELSE @cum_sum := @cur_dur
END total,
@year_month := date_format(dateOfCheckup, '%Y-%m') monthOfCheckup
from patient, (SELECT @year_month:='', @cum_sum:=0, @cur_dur:=0) variables
ORDER BY dateOfCheckup) subquery,
(SELECT @prev_month:=0, @prev_total:=0) variable
ORDER BY dateOfCheckup
我使用 1
和 0
而不是 Y
和 NULL
。
当然,输出列表中的列顺序和排序也很重要。
我使用的是 MySQL 的旧版本。由于某些强有力的原因,我无法升级它。我有一个只有 2 列的 table PatientAppointment。这是 table:
+---------------------+-----------------+
| dateOfCheckup | duration |
+---------------------+-----------------+
| 2020-05-28 | 30 min |
| 2020-05-29 | 30 min |
| 2020-05-30 | 1 hour |
| 2020-06-03 | 1 hour |
| 2020-06-05 | 1 hour 30 min |
| 2020-07-21 | 1 hour 30 min |
| 2020-07-22 | 1 hour |
| 2020-07-28 | 30 min |
+---------------------+-----------------+
我想要 5 样东西:
- 在运行时从 dateOfCheckup 创建一个新列 monthOfCheckup
- 将持续时间转换为整数字段分钟
- 每个月(不是日期)累计 总数
我通过这个查询实现了这 3 点:
select
dateOfCheckup,
duration,
@cur_dur := ((case when duration like '% hour%' then substring_index(duration, ' hour', 1) * 60 else 0 end) +
(case when duration like '%min%' then substring_index(substring_index(duration, ' min', 1), ' ', -1) + 0 else 0 end)) as minutes,
CASE WHEN @year_month = date_format(dateOfCheckup, '%Y-%m')
THEN @cum_sum := @cum_sum + @cur_dur
ELSE @cum_sum := @cur_dur
END total,
@year_month := date_format(dateOfCheckup, '%Y-%m') monthOfCheckup
from patient, (SELECT @year_month:='', @cum_sum:=0, @cur_dur:=0) variables
ORDER BY dateOfCheckup
这是相同的 fiddle。
现在剩下的2分是:
- BillElig1 这可以是布尔值或文本,无关紧要。如果那个特定月份的 总数 是 >=20 ,我只需要输入 'Y'
- BillElig2 这可以是布尔值或文本,无关紧要。如果那个特定月份的 总数 是 >=40 ,我只需要输入 'Y'
这2点你可以看这个fiddle.
请帮帮我。
再次使用 UDV。
SELECT dateOfCheckup,
duration,
minutes,
CASE WHEN @prev_month != monthOfCheckup
THEN total >= 20
WHEN @prev_total < 20
THEN 1
ELSE 0
END 99457Elig,
CASE WHEN @prev_month != monthOfCheckup
THEN total >= 40
WHEN @prev_total < 40
THEN 1
ELSE 0
END 99458Elig,
@prev_month := monthOfCheckup monthOfCheckup,
@prev_total := total total
FROM (select dateOfCheckup,
duration,
@cur_dur := ((case when duration like '% hour%' then substring_index(duration, ' hour', 1) * 60 else 0 end) +
(case when duration like '%min%' then substring_index(substring_index(duration, ' min', 1), ' ', -1) + 0 else 0 end)) as minutes,
CASE WHEN @year_month = date_format(dateOfCheckup, '%Y-%m')
THEN @cum_sum := @cum_sum + @cur_dur
ELSE @cum_sum := @cur_dur
END total,
@year_month := date_format(dateOfCheckup, '%Y-%m') monthOfCheckup
from patient, (SELECT @year_month:='', @cum_sum:=0, @cur_dur:=0) variables
ORDER BY dateOfCheckup) subquery,
(SELECT @prev_month:=0, @prev_total:=0) variable
ORDER BY dateOfCheckup
我使用 1
和 0
而不是 Y
和 NULL
。
当然,输出列表中的列顺序和排序也很重要。