gpt4 book ai didi

MySQL计算查询

转载 作者:行者123 更新时间:2023-11-29 10:40:38 24 4
gpt4 key购买 nike

我有这个表,只有两列,每条记录存储给定月份的利率:

id     rate
===========
199502 3.63
199503 2.60
199504 4.26
199505 4.25
... ...
201704 0.79
201705 0.93
201706 0.81
201707 0.80
201708 0.14

基于这个费率,我需要创建另一个类似结构的累积费率表,其数据作为 YYYYMM(月/年)参数的函数计算,这样(这个公式在法律上是强制性的):

  1. 作为参数给出的月份的比率始终为 0(零)
  2. 上个月的比率始终为 1(一)
  3. 前几个月的费率将是 (1) 加上该给定月份与作为参数给出的月份之间的月份费率之和。

我将通过这个例子来阐明这个规则,给定参数201708:

SOURCE         CALCULATED
id rate id rate
=========== =============
199502 3.63 199502 360.97 (1 + sum(rate(199503) to rate(201707)))
199503 2.60 199503 358.37 (1 + sum(rate(199504) to rate(201707)))
199504 4.26 199504 354.11 (1 + sum(rate(199505) to rate(201707)))
199505 4.25 199505 349.86 (1 + sum(rate(199506) to rate(201707)))
... ... ... ...
201704 0.79 201704 3.54 (1 + rate(201705) + rate(201706) + rate(201707))
201705 0.93 201705 2.61 (1 + rate(201706) + rate(201707))
201706 0.81 201706 1.80 (1 + rate(201707))
201707 0.80 201707 1.00 (per definition)
201708 0.14 201708 0.00 (per definition)

现在我已经实现了一个 VB.NET 函数来读取源表并生成计算表,但这是在每台客户端计算机上在运行时完成的:

Public Function AccumRates(targetDate As Date) As DataTable
Dim dtTarget = Rates.Clone
Dim targetId = targetDate.ToString("yyyyMM")
Dim targetIdAnt = targetDate.AddMonths(-1).ToString("yyyyMM")
For Each dr In Rates.Select("id<=" & targetId & " and id>199412")
If dr("id") = targetId Then
dtTarget.Rows.Add(dr("id"), 0)
ElseIf dr("id") = targetIdAnt Then
dtTarget.Rows.Add(dr("id"), 1)
Else
Dim intermediates =
Rates.Select("id>" & dr("id") & " and id<" & targetId).Select(
Function(ldr) New With {
.id = ldr.Field(Of Integer)("id"),
.rate = ldr.Field(Of Decimal)("rate")}
).ToArray
dtTarget.Rows.Add(
dr("id"),
1 + intermediates.Sum(
Function(i) i.rate))
End If
Next
Return dtTarget
End Function

我的问题是如何将其作为查询放入数据库中,以便其他查询动态使用它,这些查询将使用这些累积利率将债务更新到任何给定日期。

非常感谢!

编辑

我设法创建一个返回我想要的数据的查询,现在我只是不知道如何封装它,以便可以从另一个查询中调用它,传递任何 id 作为参数(这里我使用 SET ... 语句完成此操作):

SET @targetId=201708;
SELECT
id AS id_acum,
COALESCE(1 + (SELECT
SUM(taxa)
FROM
tableSelic AS ts
WHERE
id > id_acum AND id < @targetId
LIMIT 1),
IF(id >= @targetId, 0, 1)) AS acum
FROM
tableSelic
WHERE id>199412;

那是因为我对 MySQL 还很陌生,我习惯了 MS-Access,其中参数化查询的创建非常简单。

最佳答案

例如:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL PRIMARY KEY
,rate DECIMAL(5,2) NOT NULL
);

INSERT INTO my_table VALUES
(201704,0.79),
(201705,0.93),
(201706,0.81),
(201707,0.80),
(201708,0.14);

SELECT *
, CASE WHEN @flag IS NULL THEN @i:=1 ELSE @i:=@i+rate END i
, @flag:=1 flag
FROM my_table
, (SELECT @flag:=null,@i:=0) vars
ORDER
BY id DESC;
+--------+------+-------------+-------+------+------+
| id | rate | @flag:=null | @i:=0 | i | flag |
+--------+------+-------------+-------+------+------+
| 201708 | 0.14 | NULL | 0 | 1 | 1 |
| 201707 | 0.80 | NULL | 0 | 1.80 | 1 |
| 201706 | 0.81 | NULL | 0 | 2.61 | 1 |
| 201705 | 0.93 | NULL | 0 | 3.54 | 1 |
| 201704 | 0.79 | NULL | 0 | 4.33 | 1 |
+--------+------+-------------+-------+------+------+
5 rows in set (0.00 sec)

关于MySQL计算查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45550808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com