sql-基于多个值从组中选择行
我有一张像这样的桌子:sql-基于多个值从组中选择行,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有一张像这样的桌子: | ID | Val | +-------+-----+ | abc-1 | 10 | | abc-2 | 30 | | cde-1 | 10 | | cde-2 | 10 | | efg-1 | 20 | | efg-2 | 11 | 并希望根据子字符串(ID,1,3)和最小值得到结果,如果Val重复,ist必须是仅第一个 | ID | Val | +-------+-----+ | abc-1 | 10 | | cde-1 | 10 |
| ID | Val |
+-------+-----+
| abc-1 | 10 |
| abc-2 | 30 |
| cde-1 | 10 |
| cde-2 | 10 |
| efg-1 | 20 |
| efg-2 | 11 |
并希望根据子字符串(ID,1,3)和最小值得到结果,如果Val重复,ist必须是仅第一个
| ID | Val |
+-------+-----+
| abc-1 | 10 |
| cde-1 | 10 |
| efg-2 | 11 |
问题是我被卡住了,因为我不能使用按子字符串分组(id,1,3),id,因为它将再次有2行(分别用于abc-1和abc-2)
您使用两个子字符串(id,1,3)对列进行分组,而不是仅使用子字符串(id,1,3)。它工作得非常好。请检查下面链接中的相同示例
您使用两个子字符串(id,1,3)对列进行分组,而不是仅使用子字符串(id,1,3)。它工作得非常好。请检查下面链接中的相同示例
+1我刚写了一个答案,就看到你抢先了我一步。非常好@RRZEurope-它将获取所有在其
id
字段中具有相同前三个字符的记录,并将它们分组在一起。它将对它们进行排序,使最低的val
排在第一位,如果val被绑定,则最低的id
排在第一位。然后,外部查询将从每个组中选取第一条记录。真正的*id
值是什么样子的?-
前面是否可以有三个以上的字符?如果是这样,子字符串(id,1,3)
需要更改以匹配数据的行为。@RRZEurope-查找行号()。我上面的评论试图解释它,但基本上。。。partitionby
子句创建组。在每个组中,记录是根据ORDER BY
子句排序的。然后,每个组中的所有行将获得指定给它们的连续行号。(1,2,3,4等)在第一组中,然后在第二组中重新开始(1,2,3,4等),等等。这个答案确保得到数字1
的行始终是您想要的行。@RRZEurope-停止添加注释和删除注释,我看起来像是对不再存在的问题的分裂式回答;)抱歉,你的回复速度比我快,问完不必要的后续问题;)完毕+我正在写答案,突然发现你抢先了我一步。非常好@RRZEurope-它将获取所有在其id
字段中具有相同前三个字符的记录,并将它们分组在一起。它将对它们进行排序,使最低的val
排在第一位,如果val被绑定,则最低的id
排在第一位。然后,外部查询将从每个组中选取第一条记录。真正的*id
值是什么样子的?-
前面是否可以有三个以上的字符?如果是这样,子字符串(id,1,3)
需要更改以匹配数据的行为。@RRZEurope-查找行号()。我上面的评论试图解释它,但基本上。。。partitionby
子句创建组。在每个组中,记录按照ORDER BY
子句进行排序。然后,每个组中的所有行将获得指定给它们的连续行号。(1,2,3,4等)在第一组中,然后在第二组中重新开始(1,2,3,4等),等等。这个答案确保得到数字1
的行始终是您想要的行。@RRZEurope-停止添加注释和删除注释,我看起来像是对不再存在的问题的分裂式回答;)抱歉,你的回复速度比我快,问完不必要的后续问题;)完毕!您可以按子字符串(id,1,3)分组,而不是按子字符串(id,1,3),id分组。这将起作用…您可以按子字符串(id,1,3)分组,而不是按子字符串(id,1,3),id分组。这将起作用…除了OP希望结果中包含整个id
,而不仅仅是子字符串()。而id
必须是与MIN(val)
相对应的一个。除了OP希望结果中包含整个id
,而不仅仅是子字符串()。并且,与MIN(val)
相对应的是id
。
WITH
sorted
AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY substring(id,1,3) ORDER BY val, id) AS sequence_id
FROM
yourTable
)
SELECT
*
FROM
sorted
WHERE
sequence_id = 1
SELECT SUBSTRING(id,1,3),MIN(val) FROM Table1 GROUP BY SUBSTRING(id,1,3);