我有一个像这样的SQL Server表
+----+-----------+------------+
| 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)和ADD增量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)中创建一个函数来执行此操作?因为这是我非常理解的人,有人可以帮我解决这个问题吗? thankyou =)
答案 0 :(得分:0)
您可以为日期和ID创建单独的列。插入行时只获取当天的最大ID,如果它不存在,则从1开始。如果确实需要,可以为date + id字段创建一个额外的计算列,但是在表中你应该保留他们分开了。
答案 1 :(得分:0)
假设这是Oracle:
如果您的表已经存在,并且您显示了列,并且您想要填充列ID,则可以使用UPDATE语句执行此操作,如下所示。我使用了表名" t" - 您需要将其更改为您在查询中出现的任何位置的实际表名称。我还调用日期列dt(使用Oracle关键字作为表或列名称总是一个坏主意);如果您的专栏真的被称为"日期"你必须用" date"替换dt。 (包括双引号)。
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" column是一个真正的日期列,带有时间组件,没有" date"相等(同一天的时间组件对所有记录都不同)。否则,select语句将返回多行,插入将失败。在这种情况下,你需要解释你想如何打破关系;插入语句会有点复杂。