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