表:temp 
字段:  id   names  type 
记录1: 001  诺基亚  手机 
记录2: 002  三星    手机 
记录3: 003  摩托罗拉 手机 
记录4: 004  奔驰     汽车 
记录5: 005  宝马     汽车 
记录6: 006  奥迪     汽车 
记录7: 007  联想     电脑 
记录8: 008  戴尔     电脑 
记录9: 009  神州     电脑 
记录10: 010 宏碁     电脑 一句sql返回相同类型的三条记录 
每个类型三条 。。少与三条的就淘汰掉
问题补充:
不是查询一个类别的三条记录 返回这个表中所有不同类别的 三条记录
问题补充:
每一个类别需要三条记录 是不需要输入值的
问题补充:
这是一面试题 ... 

解决方案 »

  1.   

    select * from temp where type in ( select type from temp group by type having COUNT(*) >=3)
      

  2.   

    ----------------------------------------------------------------
    -- Author  :SQL77(只为思齐老)
    -- Date    :2010-03-16 15:15:42
    -- Version:
    --      Microsoft SQL Server  2000 - 8.00.194 (Intel X86) 
    -- Aug  6 2000 00:57:48 
    -- Copyright (c) 1988-2000 Microsoft Corporation
    -- Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:#TB
    if object_id('tempdb.dbo.#TB') is not null drop table #TB
    go 
    create table #TB([字段] varchar(7),[id] varchar(3),[names] varchar(8),[type] varchar(4))
    insert #TB
    select '记录1:','001','诺基亚','手机' union all
    select '记录2:','002','三星','手机' union all
    --select '记录3:','003','摩托罗拉','手机' union all
    select '记录4:','004','奔驰','汽车' union all
    select '记录5:','005','宝马','汽车' union all
    select '记录6:','006','奥迪','汽车' union all
    select '记录7:','007','联想','电脑' union all
    select '记录8:','008','戴尔','电脑' union all
    select '记录9:','009','神州','电脑' union all
    select '记录10:','010','宏碁','电脑'
    --------------开始查询--------------------------select * from #TB  T
    WHERE ID IN(SELECT TOP 3 ID FROM #TB WHERE type=T.type ORDER BY ID )
    AND TYPE IN(SELECT TYPE FROM #TB GROUP BY TYPE HAVING COUNT(1)>=3)
    ----------------结果----------------------------
    /*\(所影响的行数为 9 行)字段      id   names    type 
    ------- ---- -------- ---- 
    记录7:    007  联想       电脑
    记录8:    008  戴尔       电脑
    记录9:    009  神州       电脑
    记录6:    006  奥迪       汽车
    记录4:    004  奔驰       汽车
    记录5:    005  宝马       汽车(所影响的行数为 6 行) 
    */
      

  3.   

    select * from #TB  T
    WHERE TYPE IN(SELECT TYPE FROM #TB GROUP BY TYPE HAVING COUNT(1)>=3)
    AND  ID IN(SELECT TOP 3 ID FROM #TB WHERE type=T.type ORDER BY ID )
     
    ----------------结果----------------------------
    /*\(所影响的行数为 9 行)字段      id   names    type 
    ------- ---- -------- ---- 
    记录7:    007  联想       电脑
    记录8:    008  戴尔       电脑
    记录9:    009  神州       电脑
    记录6:    006  奥迪       汽车
    记录4:    004  奔驰       汽车
    记录5:    005  宝马       汽车(所影响的行数为 6 行) 
    */这一种的效率会好一点,
      

  4.   

    ---------------------------------
    --  Author: liangCK 小梁
    --  Title : 查每个分组前N条记录
    --  Date  : 2008-11-13 17:19:23
    -----------------------------------> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title VARCHAR(39),Date DATETIME)
    INSERT INTO #T
    SELECT '001',1,'邹建','深入浅出SQLServer2005开发管理与应用实例','2008-05-10' UNION ALL
    SELECT '002',1,'胡百敬','SQLServer2005性能调校','2008-03-22' UNION ALL
    SELECT '003',1,'格罗夫Groff.J.R.','SQL完全手册','2009-07-01' UNION ALL
    SELECT '004',1,'KalenDelaney','SQLServer2005技术内幕存储引擎','2008-08-01' UNION ALL
    SELECT '005',2,'Alex.Kriegel.Boris.M.Trukhnov','SQL宝典','2007-10-05' UNION ALL
    SELECT '006',2,'飞思科技产品研发中心','SQLServer2000高级管理与开发','2007-09-10' UNION ALL
    SELECT '007',2,'胡百敬','SQLServer2005数据库开发详解','2008-06-15' UNION ALL
    SELECT '008',3,'陈浩奎','SQLServer2000存储过程与XML编程','2005-09-01' UNION ALL
    SELECT '009',3,'赵松涛','SQLServer2005系统管理实录','2008-10-01' UNION ALL
    SELECT '010',3,'黄占涛','SQL技术手册','2006-01-01'--SQL查询如下:--按GID分组,查每个分组中Date最新的前2条记录
    --1.字段ID唯一时:
    SELECT * FROM #T AS T WHERE ID IN(SELECT TOP 2 ID FROM #T WHERE GID=T.GID ORDER BY Date DESC)--2.如果ID不唯一时:
    SELECT * FROM #T AS T WHERE 2>(SELECT COUNT(*) FROM #T WHERE GID=T.GID AND Date>T.Date)--SQL Server 2005 使用新方法--3.使用ROW_NUMBER()进行排位分组
    SELECT ID,GID,Author,Title,Date
    FROM
    (
       SELECT rid=ROW_NUMBER() OVER(PARTITION BY GID ORDER BY Date DESC),*
       FROM #T
    ) AS T
    WHERE rid<=2--4.使用APPLY
    SELECT DISTINCT b.*
    FROM #T AS a
    CROSS APPLY
    (
        SELECT TOP(2) * FROM #T WHERE a.GID=GID ORDER BY Date DESC
    ) AS b
    --结果
    /*ID   GID         Author                        Title                                   Date
    ---- ----------- ----------------------------- --------------------------------------- -----------------------
    003  1           格罗夫Groff.J.R.                 SQL完全手册                                 2009-07-01 00:00:00.000
    004  1           KalenDelaney                  SQLServer2005技术内幕存储引擎                   2008-08-01 00:00:00.000
    005  2           Alex.Kriegel.Boris.M.Trukhnov SQL宝典                                   2007-10-05 00:00:00.000
    007  2           胡百敬                           SQLServer2005数据库开发详解                    2008-06-15 00:00:00.000
    009  3           赵松涛                           SQLServer2005系统管理实录                     2008-10-01 00:00:00.000
    010  3           黄占涛                           SQL技术手册                                 2006-01-01 00:00:00.000(6 行受影响)
    */
      

  5.   


    随机取的话就order by newid()就可以了
      

  6.   

    SELECT * FROM #T AS T WHERE ID IN(SELECT TOP 3 ID FROM #T WHERE  type=T.type  ORDER BY newid())
      

  7.   

    一句sql返回相同类型的三条记录 
    每个类型三条 。。少与三条的就淘汰掉楼主你,,,,,,,,,,,
      

  8.   

    好像mysql不支持那些 sql语句哦!!!!!!!!!!!!!