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
?您已将两个标记都添加到上一个问题的链接。已添加到上一个问题的链接。