Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 选择查询从具有多个id的行中获取第一行';s、 (无分区)_Sql Server_Mysql Workbench - Fatal编程技术网

Sql server 选择查询从具有多个id的行中获取第一行';s、 (无分区)

Sql server 选择查询从具有多个id的行中获取第一行';s、 (无分区),sql-server,mysql-workbench,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

我应该得到如下输出:

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

请建议使用一个简单的select查询,只获取一行而不按分区。注意:特定id的日期保持不变。

请尝试空自联接。基本上,您将每一行与该行的其他版本进行比较,但是,通过一个不等式(这里我使用了documentNo),您最终得到了一个不匹配的行

看到这个了吗

MySQL 5.6架构设置

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
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)
;
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
查询1

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
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)
;
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

编辑:即使没有诸如row_number()之类的窗口函数,也有几种方法可以解决这个问题,下面是一个例子,介绍一些特定于MySQL的替代方法

尝试空自联接。基本上,您将每一行与该行的其他版本进行比较,但是,通过一个不等式(这里我使用了documentNo),您最终得到了一个不匹配的行

看到这个了吗

MySQL 5.6架构设置

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
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)
;
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
查询1

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
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)
;
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

编辑:即使没有诸如row_number()之类的窗口函数,也有几种方法可以解决这个问题,下面是一个例子,介绍一些特定于MySQL的替代方法

3个问题:1)到目前为止你尝试了什么?2)为什么你要对使用窗口函数3进行限制?你认为第一行是什么(因为数据库行是无序的,除非你指定了基于列值的特定顺序)?1)我没办法想出办法。2) 窗口函数在我的服务器上不起作用3)如果我可以获得具有相同id的行中的任何一个,我可以使用它。您的数据库服务器是什么?您已经标记了sql server,它应该能够处理窗口功能。您可以在sql server 2014中通过查询提供分区吗?您使用的是
sql server
还是
MySQL
?你们都有三个问题:1)到目前为止你们试过什么?2)为什么你要对使用窗口函数3进行限制?你认为第一行是什么(因为数据库行是无序的,除非你指定了基于列值的特定顺序)?1)我没办法想出办法。2) 窗口函数在我的服务器上不起作用3)如果我可以获得具有相同id的行中的任何一个,我可以使用它。您的数据库服务器是什么?您已经标记了sql server,它应该能够处理窗口功能。您可以在sql server 2014中通过查询提供分区吗?您使用的是
sql server
还是
MySQL
?您已将两个标记都添加到上一个问题的链接。已添加到上一个问题的链接。