注册 登录
编程论坛 VFP论坛

如何查询结果

y12692189 发布于 2023-03-26 09:08, 1526 次点击
表1
用户编号 c(6)  
000001
000002
000003
...

表2
用户编号c(6)  记录时间 dt(8)
000001          2001-01-01 12:00
000002          2002-05-20 17:35
000003          2005-02-01 14:21
000001          2007-03-01 12:05
000002          2009-01-05 18:35
.....

如何查询每个编号的最后一条记录并输出到新表?

[此贴子已经被作者于2023-3-26 09:09编辑过]

18 回复
#2
y126921892023-03-26 09:08
编号都是唯一的
#3
sdta2023-03-26 09:29
CREATE CURSOR tt (bh c(10), sj c(16))
INSERT INTO tt VALUES ("000001", "2001-01-01 12:00")
INSERT INTO tt VALUES ("000002", "2002-05-20 17:35")
INSERT INTO tt VALUES ("000003", "2005-02-01 14:21")
INSERT INTO tt VALUES ("000001", "2007-03-01 12:05")
INSERT INTO tt VALUES ("000002", "2009-01-05 18:35")
SYS(3099,70)
SELECT * FROM tt GROUP BY bh INTO TABLE 新表
BROWSE
#4
y126921892023-03-26 10:27
回复 3楼 sdta
感谢,我饶了很多圈子,您这一句话解决问题
#5
倦猫19732023-03-26 10:46
C(16) 连接太慢,建议表2增加自增或代表顺序的 Int 字段。

程序代码:

Sys(3099,90)
Create Cursor 表1 (用户编号 C(6))
Insert Into 表1 Values ("000001")
Insert Into 表1 Values ("000002")
Insert Into 表1 Values ("000003")
Insert Into 表1 Values ("000004")

Create Cursor 表2 (用户编号 C(6), 记录时间 C(16))
Insert Into 表2 Values ("000001", "2001-01-01 12:00")
Insert Into 表2 Values ("000002", "2002-05-20 17:35")
Insert Into 表2 Values ("000003", "2005-02-01 14:21")
Insert Into 表2 Values ("000001", "2007-03-01 12:05")
Insert Into 表2 Values ("000002", "2009-01-05 18:35")

Select 用户编号, Max(记录时间) As 记录时间 From 表2 Group By 用户编号 Into Cursor t

*-- 简配版
Select a.用户编号, b.* ;
    From 表1 a ;
    Left Join t On a.用户编号 = t.用户编号 ;
    Inner Join 表2 b On t.记录时间 = b.记录时间 ;
    Order By a.用户编号
   
*-- 高配版
Select b.* From 表2 b, t Where t.记录时间 = b.记录时间 Into Cursor t1
Select a.用户编号, b.* ;
    From 表1 a ;
    Left Join t1 b On a.用户编号 = b.用户编号;
    Order By a.用户编号
   
Use In Select("t")
Use In Select("t1")
#6
y126921892023-03-26 11:41
谢谢,您这个我得研究研究。
还有一个问题,在sql 2000里这个命令是不是行不通呢?
#7
倦猫19732023-03-26 11:57
SQL2000+
程序代码:

Declare @表1 Table (用户编号 Char(6))
Insert Into @表1 Values ('000001')
Insert Into @表1 Values ('000002')
Insert Into @表1 Values ('000003')
Insert Into @表1 Values ('000004')

Declare @表2 Table (用户编号 Char(6), 记录时间 Char(16))
Insert Into @表2 Values ('000001', '2001-01-01 12:00')
Insert Into @表2 Values ('000002', '2002-05-20 17:35')
Insert Into @表2 Values ('000003', '2005-02-01 14:21')
Insert Into @表2 Values ('000001', '2007-03-01 12:05')
Insert Into @表2 Values ('000002', '2009-01-05 18:35')


Select a.用户编号, b.*
    From @表1 a
    Left Join (
        Select b.* From @表2 b, (Select 用户编号, Max(记录时间) As 记录时间 From @表2 Group By 用户编号) t
                Where t.记录时间 = b.记录时间
        ) b On a.用户编号 = b.用户编号
    Order By a.用户编号
#8
y126921892023-03-26 14:20
回复 7楼 倦猫1973
您这个运行没问题,谢谢!
可能我把问题想复杂了,如果我只想找到每个编号的最后一次记录时间,如何写呢?
#9
吹水佬2023-03-26 14:28
如果记录时间是顺序的就简单,GROUP分组可以是按顺序从头到尾扫描,到尾部就是最后一次记录。
如果记录时间是乱序的就要先排序再分类。
#10
y126921892023-03-26 14:39
程序代码:
create TABLE a(userid CHAR(6),pcharge numeric(9,2),createtime datetime)
INSERT INTO A VALUES('000001',10.21,'2001-01-01 12:00')
INSERT INTO A VALUES('000001',10.21,'2001-06-15 08:01')
INSERT INTO A VALUES('000002',10.21,'2011-07-17 05:00')
INSERT INTO A VALUES('000003',10.21,'2021-01-27 03:00')
INSERT INTO A VALUES('000001',10.21,'2002-03-13 02:00')
INSERT INTO A VALUES('000004',10.21,'2008-05-05 16:00')
INSERT INTO A VALUES('000005',10.21,'2009-03-04 17:00')
INSERT INTO A VALUES('000066',10.21,'2017-05-08 14:00')
INSERT INTO A VALUES('000003',10.21,'2023-09-03 13:00')
INSERT INTO A VALUES('000002',10.21,'2020-08-06 18:00')
INSERT INTO A VALUES('000001',10.21,'2001-06-15 08:02')
INSERT INTO A VALUES('000002',10.21,'2000-05-09 04:00')
INSERT INTO A VALUES('000001',10.21,'2002-03-06 17:00')

我想查询这个表的每个userid的最后一次记录,如何写呢?winXP+sql 2000
#11
吹水佬2023-03-26 14:54
回复 10楼 y12692189
跟上面的数据差不多吧
如果VFP的表不用SQL语句也可以,建立一个userid关联表,从最后往前扫描一次就可以。
#12
倦猫19732023-03-26 15:05
你这个可能做不出来了,至少需要一个自增字段或者其他代表顺序的唯一索引。我看不出来 CreateTime 是否就是你所需要的“最后一次”,只是逻辑上同一 UserId 同一 Datetime 出现两行完全一模一样的记录是有可能的,这样就会导致结果有误。

程序代码:

Create TABLE A (userid CHAR(6),pcharge numeric(9,2),createtime datetime)
INSERT INTO A VALUES('000001',10.21,'2001-01-01 12:00')
INSERT INTO A VALUES('000001',10.21,'2001-06-15 08:01')
INSERT INTO A VALUES('000002',10.21,'2011-07-17 05:00')
INSERT INTO A VALUES('000003',10.21,'2021-01-27 03:00')
INSERT INTO A VALUES('000001',10.21,'2002-03-13 02:00')
INSERT INTO A VALUES('000004',10.21,'2008-05-05 16:00')
INSERT INTO A VALUES('000005',10.21,'2009-03-04 17:00')
INSERT INTO A VALUES('000066',10.21,'2017-05-08 14:00')
INSERT INTO A VALUES('000003',10.21,'2023-09-03 13:00')
INSERT INTO A VALUES('000002',10.21,'2020-08-06 18:00')
INSERT INTO A VALUES('000001',10.21,'2001-06-15 08:02')
INSERT INTO A VALUES('000002',10.21,'2000-05-09 04:00')
INSERT INTO A VALUES('000001',10.21,'2002-03-06 17:00')
Go

Select a.*
    From A a, (Select UserId, Max(CreateTime) As CreateTime From A Group By UserId) t
    Where a.CreateTime = t.CreateTime
    Order By a.UserId


[此贴子已经被作者于2023-3-26 15:15编辑过]

#13
y126921892023-03-26 15:29
回复 12楼 倦猫1973
没问题,您的这个命令没问题,结果就是我想要的,虽然我没看明白
#14
倦猫19732023-03-26 15:32
以下是引用y12692189在2023-3-26 15:29:19的发言:

没问题,您的这个命令没问题,结果就是我想要的,虽然我没看明白


SQL 梗:世界上没有什么问题是一行 SQL 解决不了的,如果有,那就两行。
#15
y126921892023-03-26 16:07
程序代码:
Create TABLE A (userid CHAR(6),pcharge numeric(9,2),createtime datetime)
INSERT INTO A VALUES('000001',10.21,'2001-01-01 12:00')
INSERT INTO A VALUES('000001',10.21,'2001-06-15 08:01')
INSERT INTO A VALUES('000002',10.21,'2011-07-17 05:00')
INSERT INTO A VALUES('000003',10.21,'2021-01-27 03:00')
INSERT INTO A VALUES('000001',10.21,'2002-03-13 02:00')
INSERT INTO A VALUES('000004',10.21,'2008-05-05 16:00')
INSERT INTO A VALUES('000005',10.21,'2009-03-04 17:00')
INSERT INTO A VALUES('000006',10.21,'2017-05-08 14:00')
INSERT INTO A VALUES('000003',10.21,'2023-09-03 13:00')
INSERT INTO A VALUES('000002',10.21,'2020-08-06 18:00')
INSERT INTO A VALUES('000001',10.21,'2001-06-15 08:02')
INSERT INTO A VALUES('000002',10.21,'2000-05-09 04:00')
INSERT INTO A VALUES('000001',10.21,'2002-03-06 17:00')

Create TABLE B (userid CHAR(6),pwprtype char(5),)
INSERT INTO B VALUES('000001','DJ1')
INSERT INTO B VALUES('000002','DJ5')
INSERT INTO B VALUES('000003','DJ1')
INSERT INTO B VALUES('000004','DJ2')
INSERT INTO B VALUES('000005','DJ5')
INSERT INTO B VALUES('000006','DJ1')
INSERT INTO B VALUES('000007','DJ2')
INSERT INTO B VALUES('000008','DJ5')
INSERT INTO B VALUES('000009','DJ5')


如何查表A中不包含的表B的userid呢?我不知道我说明白了没,就是怎么查出来000007,000008,000009
#16
倦猫19732023-03-26 16:15
回复 15楼 y12692189
程序代码:

Select b.*
    From B b
    Left Join (
            Select a.*
            From A a, (Select UserId, Max(CreateTime) As CreateTime From A Group By UserId) t
            Where a.CreateTime = t.CreateTime
            ) t On b.UserId = t.UserId
    Where t.UserId Is Null
#17
倦猫19732023-03-26 16:20
回复 15楼 y12692189
你的这个需求实现方法非常多,下面这个可能是最简单也是最能被普骗接受的一种了,当然也是神坑最大的一种。

程序代码:

Select b.*
    From B b
    Where b.UserId Not In (Select t.UserId From A t Where b.userid = t.UserId)
   
   
Select b.*
    From B b
    Where Not Exists(Select t.UserId From A t Where b.userid = t.UserId)


[此贴子已经被作者于2023-3-26 16:22编辑过]

#18
y126921892023-03-27 14:48
谢谢
#19
hys31312023-06-25 11:12
学习了,谢谢!
1