请教一个SQL 查询问题。

「已注销」 2013-04-15 10:12:55
一、需求
假设数据表PrinterStatusLog:
No CmnGUID LifeCount Date
1 'FFF3D9' 10 2013-03-18 20:00:13
2 'FFF3D9' 10 2013-03-18 20:00:14
3 'FFF3D9' -1 2013-03-18 20:00:15
4 'FFF3D0' 10 2013-03-18 20:00:13
5 'FFF3D0' 10 2013-03-18 20:00:14
给定一组CmnGUID值(如:'FFF3D9','FFF3D0')在数据库中找出该表中每个CmnGUID对应的最新一条数据且LifeCount不能为-1。
如给出的CmnGUID为:'FFF3D9','FFF3D0'应该得到2、5两条数据。

二、问题
我现在用下面SQL查询时1、2、4、5都出来了,而1、4两条数据是不需要的。

SELECT "PSL"."CmnGUID","PSL"."Date","PSL"."LifeCount" FROM "PrinterStatusLog" "PSL"
WHERE "CmnGUID" in ('FFF3D9','FFF3D0')
AND "PSL"."LifeCount" <> -1 ORDER BY "PSL"."Date" DESC

求高手~

分不够了、不要介意啊~
...全文
179 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
深~海 2013-04-16
  • 打赏
  • 举报
回复
SELECT "PSL"."CmnGUID","PSL"."Date","PSL"."LifeCount" FROM "PrinterStatusLog" where "id" in (select "id", MAX("date") from "PrinterStatusLog" where where "CmnGUID" in ('FFF3D9','FFF3D0') and "PSL"."LifeCount" <> -1 ORDER BY "PSL"."CmnGUID");
qiuchu2003 2013-04-15
  • 打赏
  • 举报
回复
SELECT * FROM Table WHERE CmnGUID in ('FFF3D9','FFF3D0') AND LifeCount <> -1 AND Date IN(SELECT MAX(Date) FROM Table where CmnGUID in ('FFF3D9','FFF3D0') GROUP BY CmnGUID)
rucypli 2013-04-15
  • 打赏
  • 举报
回复
select * from tb A where not exists (select 1 from tb B where A.CmnGUDI=B.CmnGUID and A.Data<B.data)
「已注销」 2013-04-15
  • 打赏
  • 举报
回复
引用 1 楼 hyrongg 的回复:
SQL code?123456 ;with A AS( select *, row_number()over(partition by CmnGUID order by [date] DESC) rn from PrinterStatusLog WHERE lIFECOUNT!=-1)SELECT * FROM a WHERE R……
非常感谢你的回答, 忘记说了, 数据库是SQL Server 和 PostgreSQL 两个都要支持的。
hyrongg 2013-04-15
  • 打赏
  • 举报
回复

 ;with A AS(
	 select *, 
		   row_number()over(partition by CmnGUID order by [date] DESC) rn
	from PrinterStatusLog
	WHERE lIFECOUNT!=-1
)SELECT * FROM a WHERE RN=1
「已注销」 2013-04-15
  • 打赏
  • 举报
回复
谢谢楼上的回答,参照你们的回答,问题解决了。

SELECT "PSL"."CmnGUID","PSL"."Date","PSL"."LifeCount" FROM "PrinterStatusLog" "PSL" 
inner join (select "CmnGUID", MAX("Date") AS "Date" from "PrinterStatusLog" where "CmnGUID" 
in ('FFF3D9','FFF3D0') 
Group by "CmnGUID") "PSL2" on "PSL2"."CmnGUID" = "PSL"."CmnGUID" and "PSL2"."Date" = "PSL"."Date"
AND "PSL"."LifeCount" <> -1 ORDER BY "PSL"."Date" DESC
不过数据比较多的候效率不是很好,40万行数据中指定4000个CmnGUID检索时花了大概8秒左右(PostgreSQL)。 感觉这个速度还是不能接受~

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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