注册 登录
编程论坛 VFP论坛

请教下各位大大:UPDATE SQL 语句比较日期时间大小时提示关联字段时出错

shonken 发布于 2022-08-06 11:20, 1881 次点击

程序代码:

CREATE CURSOR 成绩_d (名次 I,完成时间 V(20))
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:04")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:01")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:03")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:06")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:04")
INSERT INTO 成绩_d (完成时间) VALUES ("")

Update 成绩_d Set 名次=1+(Select Count(TmpCursor.完成时间) From 成绩_d As TmpCursor With (Buffering=.T.) Where Ctot(TmpCursor.完成时间) < Ctot(成绩_d.完成时间) And !Empty(TmpCursor.完成时间) ) Where !Empty(完成时间)


要求:比较"完成时间"的大小,"完成时间"相同,名次相同。
请各位大大指教~
16 回复
#2
吹水佬2022-08-06 11:34
1+(Select Count(TmpCursor.完成时间) From 成绩_d As TmpCursor With (Buffering=.T.) Where Ctot(TmpCursor.完成时间) < Ctot(成绩_d.完成时间) And !Empty(TmpCursor.完成时间) )
这句是表达什么?
#3
shonken2022-08-06 14:30
以下是引用吹水佬在2022-8-6 11:34:24的发言:

1+(Select Count(TmpCursor.完成时间) From 成绩_d As TmpCursor With (Buffering=.T.) Where Ctot(TmpCursor.完成时间) < Ctot(成绩_d.完成时间) And !Empty(TmpCursor.完成时间) )
这句是表达什么?


吹版,结果需要显示成这样:
名次    完成时间
1    2019-05-18T00:00:01
2    2019-05-18T00:00:03
3    2019-05-18T00:00:04
3    2019-05-18T00:00:04
5    2019-05-18T00:00:06
#4
吹水佬2022-08-06 15:18
按“完成时间”排一下再依次计“名次”,这个没那么复杂吧
#5
shonken2022-08-06 15:21
以下是引用吹水佬在2022-8-6 15:18:41的发言:

按“完成时间”排一下再依次计“名次”,这个没那么复杂吧


有更简单的方法么...
#6
吹水佬2022-08-06 15:46
以下是引用shonken在2022-8-6 15:21:04的发言:



有更简单的方法么...

“排队点名”还不够简单,想要多简单的?
#7
shonken2022-08-06 16:09
UPDATE SQL 语句比较日期时间大小时提示关联字段时出错

估计是子查询过多运算引致,现增加了一字段,将字段"完成时间"处理为金额数值,问题解决,可以显示同数值同名次,并占位。


Update 成绩_d Set 名次=1+(Select Count(TmpCursor.完成时间) From 成绩_d As TmpCursor With (Buffering=.T.) Where TmpCursor.日期时间值 > 成绩_d.日期时间值 And !Empty(TmpCursor.完成时间) ) Where !Empty(完成时间)
#8
shonken2022-08-06 16:10
以下是引用吹水佬在2022-8-6 15:46:57的发言:


“排队点名”还不够简单,想要多简单的?

名次    完成时间
1    2019-05-18T00:00:01
2    2019-05-18T00:00:03
3    2019-05-18T00:00:04
3    2019-05-18T00:00:04
5    2019-05-18T00:00:06

吹版,同分同名次,并占位,注意看名次,里面没有4
#9
sdta2022-08-06 17:23
是不是这样的效果
只有本站会员才能查看附件,请 登录
#10
sdta2022-08-06 17:29
以下是引用shonken在2022-8-6 15:21:04的发言:



有更简单的方法么...

个人理解方法简单,在于数据处理速度的快慢
#11
shonken2022-08-06 18:06
以下是引用sdta在2022-8-6 17:29:12的发言:


个人理解方法简单,在于数据处理速度的快慢


对的对的
#12
shonken2022-08-06 18:06
以下是引用sdta在2022-8-6 17:23:58的发言:

是不是这样的效果

是的,要这效果
#13
吹水佬2022-08-06 18:25
以下是引用shonken在2022-8-6 16:10:36的发言:


名次    完成时间
1    2019-05-18T00:00:01
2    2019-05-18T00:00:03
3    2019-05-18T00:00:04
3    2019-05-18T00:00:04
5    2019-05-18T00:00:06

吹版,同分同名次,并占位,注意看名次,里面没有4

生成按时间排队的表,从上到下扫描一次,相对上一条记录,不同时间的名次为记录号,同时间的名次不变,是这意思吧,还不够简单明了。
你那个每条记录都 set .. = .. select ....... ,数据记录多时效率可能相对会慢。
#14
sdta2022-08-06 18:41
只会用VFP处理名次问题
程序代码:
CREATE CURSOR 成绩_d (名次 I,完成时间 V(20))
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:08")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:01")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:03")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:06")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:04")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:05")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:00:05")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:01:04")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:01:04")
INSERT INTO 成绩_d (完成时间) VALUES ("2019-05-18T00:01:05")
INSERT INTO 成绩_d (完成时间) VALUES ("")

 
SELECT * FROM 成绩_d WHERE NOT EMPTY(完成时间) ORDER BY 完成时间 INTO CURSOR tt READWRITE
lcStr = SPACE(1)
lnCnt = 0
SCAN
    lnCnt = lnCnt + 1
    IF 完成时间 != lcStr
        lnmc = lnCnt
    ENDIF
    REPLACE 名次 WITH lnmc
    lcStr = 完成时间
ENDSCAN

BROWSE
#15
shonken2022-08-06 20:33
以下是引用吹水佬在2022-8-6 18:25:44的发言:


生成按时间排队的表,从上到下扫描一次,相对上一条记录,不同时间的名次为记录号,同时间的名次不变,是这意思吧,还不够简单明了。
你那个每条记录都 set .. = .. select ....... ,数据记录多时效率可能相对会慢。


这样么,我好像过于迷信SQL语句的效率了......
#16
吹水佬2022-08-06 20:41
以下是引用shonken在2022-8-6 20:33:40的发言:



这样么,我好像过于迷信SQL语句的效率了......

SELECT - SQL 命令通常是比较高效
但 SELECT 意味着要遍历表记录,如果一条语句出现多个 SELECT 就未必是好事,尤其是在处理每条记录时都要 SELECT
#17
shonken2022-08-06 21:15
以下是引用吹水佬在2022-8-6 20:41:45的发言:


SELECT - SQL 命令通常是比较高效
但 SELECT 意味着要遍历表记录,如果一条语句出现多个 SELECT 就未必是好事,尤其是在处理每条记录时都要 SELECT


好的,了解了,谢谢~
1