选择查询以从具有多个id的行中获取第一行。(不分区)

时间:2016-06-04 03:09:29

标签: sql-server mysql-workbench

id   date         amount      documentNo     paperID
1    2015/10/15   500         1234             34
1    2015/10/15   100         1332             33
2    2015/10/13   200         1302             21
2    2015/10/13   400         1332             33
3    2015/11/23   500         1332             43

我应该得到输出:

id        date      amount       documentNo     paperID
1       2015/10/15   500         1234             34
2       2015/10/13   200         1302             21
3       2015/11/23   500         1332             43

请建议一个简单的选择查询,以便只获取一行而不分区。注意:特定ID的日期保持不变。

1 个答案:

答案 0 :(得分:2)

尝试null-self-join。基本上你将每一行与该行的其他版本进行比较,但是,通过不等式(这里我使用了documentNo),你最终得到一行没有匹配的行。

请参阅此SQL Fiddle

MySQL 5.6架构设置

CREATE TABLE Table1
    (`id` int, `date` datetime, `amount` int, `documentNo` int, `paperID` int)
;

INSERT INTO Table1
    (`id`, `date`, `amount`, `documentNo`, `paperID`)
VALUES
    (1, '2015-10-15 00:00:00', 500, 1234, 34),
    (1, '2015-10-15 00:00:00', 100, 1332, 33),
    (2, '2015-10-13 00:00:00', 200, 1302, 21),
    (2, '2015-10-13 00:00:00', 400, 1332, 33),
    (3, '2015-11-23 00:00:00', 500, 1332, 43)
;

查询1

SELECT
      t1.*
FROM table1 AS t1
      LEFT OUTER JOIN table1 AS t2 ON t1.id = t2.id
                  AND t1.date = t2.date
                  AND t2.documentNo < t1.documentNo
WHERE t2.ID IS NULL

<强> Results

| id |                       date | amount | documentNo | paperID |
|----|----------------------------|--------|------------|---------|
|  1 |  October, 15 2015 00:00:00 |    500 |       1234 |      34 |
|  2 |  October, 13 2015 00:00:00 |    200 |       1302 |      21 |
|  3 | November, 23 2015 00:00:00 |    500 |       1332 |      43 |
编辑:即使没有诸如row_number()之类的窗口函数,也有几种解决此问题的方法,这里有previous answer覆盖一些MySQL特定的替代方案。