免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2353 | 回复: 8
打印 上一主题 下一主题

请教查询问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-13 16:56 |只看该作者 |倒序浏览
假设我有以下记录:
有表 "计算机",记录如下:
设备编号  ip地址      登记日期      变更记录
1002       10.0.0.88    2004-01-02     新购
1002       10.0.0.88    2004-08-10     主板坏了
1003       10.0.0.75    2004-02-10     赠送
1003       10.0.0.75    2004-03-10     显示器更换为液晶
1003       10.0.0.75    2004-03-10     调配给国务院了
1004       10.0.0.19    2004-01-10     CPU烧毁,更换CPU
1004       10.0.0.19    2004-07-10     淘汰
1007                   2004-07-10     我家的电脑,不要显示

我用
select distinct on(ip地址) * from 计算机 where ip地址 is not null
得出
1002       10.0.0.88    2004-01-02     新购
1003       10.0.0.75    2004-02-10     赠送
1004       10.0.0.19    2004-01-10     CPU烧毁,更换CPU


我想让列出ip地址唯一,日期最新的记录,该如何写SQL语句.就是要让结果为:


1002       10.0.0.88    2004-08-10     主板坏了
1003       10.0.0.75    2004-03-10     调配给国务院了
1004       10.0.0.19    2004-07-10     淘汰


请大侠们指点.尽量一个SQL语句解决问题

论坛徽章:
0
2 [报告]
发表于 2004-09-14 13:00 |只看该作者

请教查询问题

select distinct on(ip, 登记日期) * from xxxx wher yyyy order by 登记日期

论坛徽章:
0
3 [报告]
发表于 2004-09-15 09:51 |只看该作者

请教查询问题

首先谢谢 bitbird回帖.
我想您是没有测试.这种 distinct on(xxx) ..... order by ....的语句我早就试过了.不行.数据库系统不允许这样做.
再次提醒广大网友在回复贴子的时候自己先试验一下.
我试过 7.3.4与 8.0.0beta2 版本,都不行.
也欢迎到 http://www.rebecca.com.cn/phpPgAdmin/ 下测试,用户名与密码都是test

论坛徽章:
0
4 [报告]
发表于 2004-09-17 09:23 |只看该作者

请教查询问题

//建表,插入数据
-- EMS PostgreSQL Manager 2.4.0.1
-- ---------------------------------------
-- Host     : 192.168.1.6
-- Database : template1

SET search_path = public, pg_catalog;
DROP TABLE public.comp;
--
-- Structure for table comp (OID = 19294) :
--
CREATE TABLE comp (
    id serial NOT NULL,
    ip varchar(3),
    dt date,
    rm text
);
--
-- Data for blobs (OID = 19294) (LIMIT 0,5)
--
INSERT INTO comp (id, ip, dt, rm) VALUES (3, 'b', '2001-01-02', 'cc');
INSERT INTO comp (id, ip, dt, rm) VALUES (4, 'd', '2004-01-09', 'dd');
INSERT INTO comp (id, ip, dt, rm) VALUES (5, NULL, '2001-01-01', 'ee');
INSERT INTO comp (id, ip, dt, rm) VALUES (1, 'a', '2005-01-01', 'aaa');
INSERT INTO comp (id, ip, dt, rm) VALUES (2, 'a', '2005-10-02', 'bb');
COMMIT;
--
-- Data for sequence public.comp_id_seq (OID = 19292)
--
SELECT pg_catalog.setval('comp_id_seq', 5, true);
COMMENT ON SCHEMA public IS 'Standard public schema';


//SQL语句
select  * from comp
where (ip,dt) IN
(
select distinct on(ip) ip,dt from comp where ip is not null
)
order by dt

局限:你要确保,ip和dt组合唯一,即他们是表的组合键

论坛徽章:
0
5 [报告]
发表于 2004-09-17 17:41 |只看该作者

请教查询问题

根据你的语句,我略加改变,形成了使用的系统。再次感谢!可以看实例:

http://www.rebecca.com.cn/erp/comp.php

另外进一步请教我想让 ip的排列为 10.0.0.1,10.0.0.2,10.0.0.3,....10.0.1.1,10.0.1.2,

我的ip为字符型字段,请进一步指教。

论坛徽章:
0
6 [报告]
发表于 2004-09-20 11:06 |只看该作者

请教查询问题

为了不让我的帖子沉了.我给大家我的SQL语句:

  1. select distinct on(ip) 登记日期,ip,保管人,设备编号,CPU,存放地点 from computer where (登记日期,ip) IN(select  登记日期,ip from computer where ip is not null order by 登记日期)
复制代码


结果参见: http://www.rebecca.com.cn/comp.php

我的服务器的其它秘密:

http://www.rebecca.com.cn/download/tools/linux/phpsysinfo-dev/

论坛徽章:
0
7 [报告]
发表于 2004-09-20 12:41 |只看该作者

请教查询问题

上次讲的局限:你要确保,ip和dt组合唯一,即他们是表的组合键

上次我已讲了一下,实际上,同一ip,意味着同一机器,在同一天内,同一台机器维护记录应该只有一条,所有按日期,再按ip排是无意义的。

要么,就按ip排序

建表:
-- EMS PostgreSQL Manager 2.4.0.1
-- ---------------------------------------
-- Host : 192.168.1.6
-- Database : template1



--
-- Structure for table comp (OID = 26703) :
--
SET search_path = public, pg_catalog;
CREATE TABLE comp (
id serial NOT NULL,
ip character varying(20),
dt date,
rm text
);
--
-- Data for blobs (OID = 26703) (LIMIT 0,5)
--
INSERT INTO comp (id, ip, dt, rm) VALUES (5, NULL, '2001-01-01', 'ee');
INSERT INTO comp (id, ip, dt, rm) VALUES (3, '10.0.0.1', '2001-01-02', 'cc');
INSERT INTO comp (id, ip, dt, rm) VALUES (1, '10.0.1.1', '2005-01-01', 'aaa');
INSERT INTO comp (id, ip, dt, rm) VALUES (2, '10.0.1.1', '2005-10-02', 'bb');
INSERT INTO comp (id, ip, dt, rm) VALUES (4, '10.0.3.1', '2004-01-09', 'dd');
COMMIT;
--
-- Data for sequence public.comp_id_seq (OID = 26701)
--
SELECT pg_catalog.setval('comp_id_seq', 7, false);
COMMENT ON SCHEMA public IS 'Standard public schema';

//查询
select * from comp
where (ip,dt) IN
(
select distinct on(ip) ip,dt from comp where ip is not null
)
order by ip

如果ip,日期不是组合键,直接加就行
order by dt,ip或order by ip,dt

论坛徽章:
0
8 [报告]
发表于 2004-09-20 16:07 |只看该作者

请教查询问题

我已经检索出了每台机器的最新记录.
例子见: http://www.rebecca.com.cn/erp/comp.php
现在我想让他们按 10.0.0.1 10.0.0.2 10.0.0.3....10.0.0.10 10.0.0.11的顺序排列.很有意义.看看哪些ip没有用到.

另外也是学习postgresql,因为现在干的已经可以用了!

论坛徽章:
0
9 [报告]
发表于 2004-09-22 10:04 |只看该作者

请教查询问题

netkiller 建议我改数据类型.一下子问题就解决了.

看效果:
http://www.rebecca.com.cn/erp/comp.php
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP