QL查询案例:取得分组 TOP-N
Jun 07, 2016 pm 05:37 PM【转】SQL查询案例:取得分组 TOP-N CREATE TABLE TopnTest ( name VARCHAR(10), --姓名 procDate DATETIME, --处理时间 result INT --成绩 ); INSERT INTO TopnTest VALUES('张三', '2010-10-01 12:00:05', 80); INSERT INTO TopnTest VALUES('张三', '2010
【转】SQL查询案例:取得分组 TOP-N
CREATE TABLE TopnTest (
name VARCHAR(10), --姓名
procDate DATETIME, --处理时间
result INT --成绩
);
INSERT INTO TopnTest VALUES('张三', '2010-10-01 12:00:05', 80);
INSERT INTO TopnTest VALUES('张三', '2010-10-01 12:20:05', 85);
INSERT INTO TopnTest VALUES('张三', '2010-10-02 07:25:15', 79);
INSERT INTO TopnTest VALUES('张三', '2010-10-02 10:30:05', 88);
INSERT INTO TopnTest VALUES('张三', '2010-10-03 15:05:05', 86);
INSERT INTO TopnTest VALUES('李四', '2010-10-01 06:00:05', 60);
INSERT INTO TopnTest VALUES('李四', '2010-10-04 08:00:05', 90);
INSERT INTO TopnTest VALUES('李四', '2010-10-05 10:00:05', 75);
INSERT INTO TopnTest VALUES('李四', '2010-10-08 11:00:05', 88);
INSERT INTO TopnTest VALUES('李四', '2010-10-09 12:00:05', 60);
INSERT INTO TopnTest VALUES('王五', '2010-09-10 08:00:05', 70);
INSERT INTO TopnTest VALUES('王五', '2010-09-14 08:00:05', 80);
INSERT INTO TopnTest VALUES('王五', '2010-09-25 18:00:05', 75);
INSERT INTO TopnTest VALUES('王五', '2010-09-28 18:00:05', 88);
INSERT INTO TopnTest VALUES('王五', '2010-10-09 12:00:05', 70);
要求
取得每个人的最近2次处理时间的详细记录情况。
思路
如果仅仅是一个人的最近2次,那么直接TOP 2或者Rownum
每个人的最近1次,也可以通过SELECT MAX() GROUP BY来实现。
每个人的最近2次,需要自己和自己关联,才能解决了。
实现
SELECT
*
FROM
TopnTest
WHERE
( SELECT
COUNT(1)
FROM
TopnTest subTopnTest
WHERE
TopnTest.name = subTopnTest.name
AND TopnTest.procDate
)
ORDER BY
name, procDate
执行结果
name procDate result
---------- ----------------------- -----------
李四 2010-10-08 11:00:05.000 88
李四 2010-10-09 12:00:05.000 60
王五 2010-09-28 18:00:05.000 88
王五 2010-10-09 12:00:05.000 70
张三 2010-10-02 10:30:05.000 88
张三 2010-10-03 15:05:05.000 86
如果上面的 SQL , 你不怎么看得懂, 那么下面这样的写法,与执行结果,应该能让你更加容易明白一些上面的SQL的处理的原理。
SELECT
name,
procDate,
result,
( SELECT
COUNT(1)
FROM
TopnTest subTopnTest
WHERE
TopnTest.name = subTopnTest.name
AND TopnTest.procDate ) AS [有多少行数据处理时间比当前行大]
FROM
TopnTest
ORDER BY
name, procDate
name procDate result 有多少行数据处理时间比当前行大
---------- ----------------------- ----------- ---------------
李四 2010-10-01 06:00:05.000 60 4
李四 2010-10-04 08:00:05.000 90 3
李四 2010-10-05 10:00:05.000 75 2
李四 2010-10-08 11:00:05.000 88 1
李四 2010-10-09 12:00:05.000 60 0
王五 2010-09-10 08:00:05.000 70 4
王五 2010-09-14 08:00:05.000 80 3
王五 2010-09-25 18:00:05.000 75 2
王五 2010-09-28 18:00:05.000 88 1
王五 2010-10-09 12:00:05.000 70 0
张三 2010-10-01 12:00:05.000 80 4
张三 2010-10-01 12:20:05.000 85 3
张三 2010-10-02 07:25:15.000 79 2
张三 2010-10-02 10:30:05.000 88 1
张三 2010-10-03 15:05:05.000 86 0
(15 行受影响)
,
Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Bagaimana untuk menyemak kelayakan akademik anda di Xuexin.com

12306 Cara menyemak rekod pembelian tiket sejarah Cara menyemak rekod pembelian tiket sejarah

Bagaimana untuk menyemak tarikh pengaktifan pada telefon bimbit Apple

Bagaimana untuk menggunakan Oracle untuk bertanya sama ada jadual dikunci?

Perbandingan persamaan dan perbezaan antara MySQL dan PL/SQL

Bagaimana untuk menyemak harga terkini Tongshen Coin?

Bincangkan perkongsian kemahiran pertanyaan lokasi pangkalan data

Bagaimana untuk menyemak harga terkini syiling INJ?
