哪位大哥帮忙写一下这个SQL。

zhang865 2009-02-27 11:02:48
表A,字段 ID , NAME , TIME , STATUS (NAME , TIME 时间 , STATUS =0,1,2,3,4)

我想查询的是

每天有多少个STATUS=0的NAME ,在今天之前没有过该NAME的记录 。
...全文
110 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang865 2009-02-27
  • 打赏
  • 举报
回复
select count(distinct(NAME)) as num,left(from_unixtime(TIME),10) as htime from stat t1
where STATUS=0
and not exist (select 1 from stat where NAME=t1.NAME and TIME<((t1.TIME/(24*3600))*24*3600) )
group by left(htime,10) order by htime ;

大概意思是这样的,但是发现这个语句不对啊
zhang865 2009-02-27
  • 打赏
  • 举报
回复
NAME TIME STATUS

A 1224918001 0
B 1224918002 1
A 1224918003 1
B 1224918004 0
C 1224918005 0
D 1224918006 0
E 1224918007 0 -----这是 2008-10-26 的数据
A 1225004401 0
B 1225004402 1
A 1225004403 1
C 1225004405 0
D 1225004406 0
E 1225004407 0
F 1225004408 0
G 1225004409 0
H 1225004410 0 -----这是 2008-10-27 的数据
C 1225090805 0
D 1225090806 0
E 1225090807 0
F 1225090808 0
G 1225090809 0
H 1225090810 0
J 1225090809 1
I 1225090810 0 -----这是 2008-10-28 的数据


结果是
5 2008-10-26 (A,B,C,D,E)
3 2008-10-27 (F,G,H)
1 2008-10-28 (I)

注意:括号里的是提示,不是结果。
ACMAIN_CHM 2009-02-27
  • 打赏
  • 举报
回复
问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧

猜一下你想要的结果。我的汉语水平一般。猜谜水平更差,所以猜错了也很正常。

select name
from a t1
where STATUS=0
and not exist (select 1 from a where name=t1.name and time<t1.time)
WWWWA 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhang865 的回复:]
引用 1 楼 wwwwb 的回复:
贴记录及正确结果出来看看
每天有多少个STATUS=0的NAME
SELECT NAME,COUNT(*) FROM TT GROUP BY NAME WHERE STATUS=0


GG ,没有后面的条件啊“在这条记录的日期之前没有该NAME的记录”  ,需要 group by left(from_unixtime(TIME),10)
[/Quote]
呵呵,贴记录及正确结果吧,直观一些
zhang865 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwwb 的回复:]
贴记录及正确结果出来看看
每天有多少个STATUS=0的NAME
SELECT NAME,COUNT(*) FROM TT GROUP BY NAME WHERE STATUS=0
[/Quote]

GG ,没有后面的条件啊“在这条记录的日期之前没有该NAME的记录” ,需要 group by left(from_unixtime(TIME),10)
wwwwb 2009-02-27
  • 打赏
  • 举报
回复
贴记录及正确结果出来看看
每天有多少个STATUS=0的NAME
SELECT NAME,COUNT(*) FROM TT GROUP BY NAME WHERE STATUS=0
WWWWA 2009-02-27
  • 打赏
  • 举报
回复
当然不对,已经说过,FF的内容为
2008-10-26
2008-10-27
2008-10-28
即根据5楼的日期输入FF的值,因为你的结果要求日期,根据TIME怎么
得出日期?
zhang865 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 WWWWA 的回复:]
SELECT A.FF, COUNT(*)
FROM (SELECT A.FF,A.NAME FROM TTR A LEFT JOIN TTR B ON A.ff>B.ff
AND A.NAME=B.NAME WHERE B.NAME IS NULL and a.STATUS=0 GROUP BY A.FF,A.NAME )
GROUP BY A.FF;
[/Quote]

我的意思是 group by left(from_unixtime(A.TIME),10) , 但是我把你的A.FF 替换为left(from_unixtime(A.TIME),10) 不对啊。
ACMAIN_CHM 2009-02-27
  • 打赏
  • 举报
回复
select time,count(*) 
from a t1
where STATUS=0
and not exists (select 1 from a where name=t1.name and time<t1.time)
group by time


exist -> exists
WWWWA 2009-02-27
  • 打赏
  • 举报
回复
SELECT A.FF, COUNT(*)
FROM (SELECT A.FF,A.NAME FROM TTR A LEFT JOIN TTR B ON A.ff>B.ff
AND A.NAME=B.NAME WHERE B.NAME IS NULL and a.STATUS=0 GROUP BY A.FF,A.NAME )
GROUP BY A.FF;
WWWWA 2009-02-27
  • 打赏
  • 举报
回复
更简单:
SELECT A.FF, COUNT(*)
FROM (SELECT A.FF,A.NAME FROM TTR A LEFT JOIN TTR B ON A.time>B.time
AND A.NAME=B.NAME WHERE B.NAME IS NULL GROUP BY A.FF,A.NAME)
GROUP BY A.FF;
zhang865 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 WWWWA 的回复:]
2008-10-28 :应该为I、J吧
[/Quote]

J STATUS=1 ,所以不算 。
zhang865 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 WWWWA 的回复:]
假设不累计,只与前一天相比:
加入FF字段,内容为
2008-10-26
2008-10-27
2008-10-28

SELECT A.FF,COUNT(*) FROM (
SELECT A.FF,A.NAME FROM TTR A LEFT JOIN TTR B ON A.FF=DATEADD('D',1,B.FF)
AND A.NAME=B.NAME WHERE B.NAME IS NULL GROUP BY A.FF,A.NAME) GROUP BY A.FF
[/Quote]

这个有点复杂,没看懂 。 而且,累计的,比就比以前的,不是前一天的。
WWWWA 2009-02-27
  • 打赏
  • 举报
回复
2008-10-28 :应该为I、J吧
WWWWA 2009-02-27
  • 打赏
  • 举报
回复
假设不累计,只与前一天相比:
加入FF字段,内容为
2008-10-26
2008-10-27
2008-10-28

SELECT A.FF,COUNT(*) FROM (
SELECT A.FF,A.NAME FROM TTR A LEFT JOIN TTR B ON A.FF=DATEADD('D',1,B.FF)
AND A.NAME=B.NAME WHERE B.NAME IS NULL GROUP BY A.FF,A.NAME) GROUP BY A.FF
zhang865 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ACMAIN_CHM 的回复:]
SQL codeselect time,count(*)
from a t1
where STATUS=0
and not exist (select 1 from a where name=t1.name and time<t1.time)
group by time
[/Quote]

和我写的基本一样吧
select count(distinct(NAME)) as num,left(from_unixtime(TIME),10) as htime from stat t1
where STATUS=0
and not exist (select 1 from stat where NAME=t1.NAME and TIME <((t1.TIME/(24*3600))*24*3600) )
group by left(htime,10) order by htime ;


mysql 说 and not exist (select 1 from stat where NAME=t1.NAME and TIME <((t1.TIME/(24*3600))*24*3600) ) 这有错误
zhang865 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ljf_ljf 的回复:]
下面这句应该可以实现,不用太过复杂SQL啊;自己写得辛苦,看得人更加辛苦。

SQL codeselect a.time,count(*) from a where a.status = 0 group by (a.TIME/(24*3600))*24*3600)
[/Quote]

这个没有引用,之前的日期没有出现过记录的条件啊。
ACMAIN_CHM 2009-02-27
  • 打赏
  • 举报
回复
select time,count(*) 
from a t1
where STATUS=0
and not exist (select 1 from a where name=t1.name and time<t1.time)
group by time
ljf_ljf 2009-02-27
  • 打赏
  • 举报
回复
下面这句应该可以实现,不用太过复杂SQL啊;自己写得辛苦,看得人更加辛苦。
select a.time,count(*) from a where a.status = 0 group by (a.TIME/(24*3600))*24*3600) 

56,681

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧