在一天内自动插入带有计数器重置的数据库
automatically insertion database with counter reset within a day
我有一个 SQL 服务器 table 像这样
+----+-----------+------------+
| id | account | date |
+----+-----------+------------+
| | John | 2016/6/2 |
| | John | 2016/6/2 |
| | John | 2016/6/2 |
| | John | 2016/6/4 |
| | Andi | 2016/6/4 |
| | Steve | 2016/6/2 |
+----+-----------+------------+
问题是我想按日期自动插入 "id" 列,并将日期更改为字符串,如数据类型 (char/varchar) 并在末尾添加递增 3 位计数器(开始从 001 开始)每天重置计数器(日期更改时重置,但如果日期相同,则可以从最后一个计数器继续)。
示例:
+-------------+---------+-----------+
| id | account | date |
+-------------+---------+-----------+
| 20160602001 | John | 2016/6/2 |
| 20160602002 | John | 2016/6/2 |
| 20160604003 | John | 2016/6/2 |
| 20160604001 | John | 2016/6/4 | >counter reset when the date is change
| 20160604002 | Andi | 2016/6/4 |
| 20160604004 | Steve | 2016/6/2 | >counter continue
+-------------+---------+-----------+
我想在 oracle 中实现 sql 开发人员可以帮我一下吗?
我一直在考虑在纯数据库查询中尝试这个是否可能? (只要 "id" 列保持我需要的状态,就可以添加更多列或稍微修改一下)或者是否需要在 C# (ASP.NET) 中创建一个函数来执行此操作?因为这是我很了解的一个,有人可以帮我解决这个问题吗?谢谢=)
您可以只为日期和 ID 创建单独的列。插入行时只获取当天的最大 id,如果不存在,则从 1 开始。如果确实需要,可以为 date + id 字段创建一个额外的计算列,但是在 table 你应该把它们分开。
假设这是 Oracle:
如果您的 table 已经存在,并且您显示的列已经存在,并且您想要填充列 ID,则可以使用 UPDATE 语句来完成,如下所示。我使用了 table 名称 "t" - 您需要将其更改为您实际的 table 名称出现在我的查询中的任何地方。我还将日期列称为 dt(使用 Oracle 关键字作为 table 或列名总是一个坏主意);如果您的专栏确实名为 "date",则必须将 dt 替换为 "date"(包括双引号)。
update t set id =
(with h(dt,rn) as
(select dt, row_number() over (partition by trunc(dt) order by dt) from t)
select to_char(dt, 'yyyymmdd') || to_char(rn, 'FM009') from h where h.dt = t.dt)
这假设 "date" 列确实是一个日期列,具有时间部分,并且没有 "dates" 是相等的(同一天的时间部分对于所有记录都是不同的)。否则select语句returns多了一行,插入就会失败。在那种情况下,你需要解释你想如何打破联系;插入语句会稍微复杂一些。
我有一个 SQL 服务器 table 像这样
+----+-----------+------------+
| id | account | date |
+----+-----------+------------+
| | John | 2016/6/2 |
| | John | 2016/6/2 |
| | John | 2016/6/2 |
| | John | 2016/6/4 |
| | Andi | 2016/6/4 |
| | Steve | 2016/6/2 |
+----+-----------+------------+
问题是我想按日期自动插入 "id" 列,并将日期更改为字符串,如数据类型 (char/varchar) 并在末尾添加递增 3 位计数器(开始从 001 开始)每天重置计数器(日期更改时重置,但如果日期相同,则可以从最后一个计数器继续)。 示例:
+-------------+---------+-----------+
| id | account | date |
+-------------+---------+-----------+
| 20160602001 | John | 2016/6/2 |
| 20160602002 | John | 2016/6/2 |
| 20160604003 | John | 2016/6/2 |
| 20160604001 | John | 2016/6/4 | >counter reset when the date is change
| 20160604002 | Andi | 2016/6/4 |
| 20160604004 | Steve | 2016/6/2 | >counter continue
+-------------+---------+-----------+
我想在 oracle 中实现 sql 开发人员可以帮我一下吗? 我一直在考虑在纯数据库查询中尝试这个是否可能? (只要 "id" 列保持我需要的状态,就可以添加更多列或稍微修改一下)或者是否需要在 C# (ASP.NET) 中创建一个函数来执行此操作?因为这是我很了解的一个,有人可以帮我解决这个问题吗?谢谢=)
您可以只为日期和 ID 创建单独的列。插入行时只获取当天的最大 id,如果不存在,则从 1 开始。如果确实需要,可以为 date + id 字段创建一个额外的计算列,但是在 table 你应该把它们分开。
假设这是 Oracle:
如果您的 table 已经存在,并且您显示的列已经存在,并且您想要填充列 ID,则可以使用 UPDATE 语句来完成,如下所示。我使用了 table 名称 "t" - 您需要将其更改为您实际的 table 名称出现在我的查询中的任何地方。我还将日期列称为 dt(使用 Oracle 关键字作为 table 或列名总是一个坏主意);如果您的专栏确实名为 "date",则必须将 dt 替换为 "date"(包括双引号)。
update t set id =
(with h(dt,rn) as
(select dt, row_number() over (partition by trunc(dt) order by dt) from t)
select to_char(dt, 'yyyymmdd') || to_char(rn, 'FM009') from h where h.dt = t.dt)
这假设 "date" 列确实是一个日期列,具有时间部分,并且没有 "dates" 是相等的(同一天的时间部分对于所有记录都是不同的)。否则select语句returns多了一行,插入就会失败。在那种情况下,你需要解释你想如何打破联系;插入语句会稍微复杂一些。