2012-03-16 71 views
1

我有这样一个表从组选择行:SQL - 基于多个值

| ID | Val | 
+-------+-----+ 
| abc-1 | 10 | 
| abc-2 | 30 | 
| cde-1 | 10 | 
| cde-2 | 10 | 
| efg-1 | 20 | 
| efg-2 | 11 | 

和想获得基于所述串(ID,1,3)最小值的结果和IST必须只有第一万一瓦尔具有重复

| ID | Val | 
+-------+-----+ 
| abc-1 | 10 | 
| cde-1 | 10 | 
| efg-2 | 11 | 

的问题是,我坚持,因为我不能用组由子串(ID,1,3),ID因为它将然后再次有2行(每一个用于ABC-1和ABC-2)

+0

U可以按子串(ID,1,3)来代替子串(ID,1,3),ID。这将起作用... – Teja 2012-03-16 14:04:11

回答

9
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 
+0

+1当我看到你打我时,我只是在写一个答案。非常好! – 2012-03-16 13:58:25

+0

@RRZEurope - 它将做的是将所有记录在其“id”字段中具有相同的前三个字符并将它们组合在一起。它会对它们进行排序,所以最低的'val'首先出现,而最低的'id'先出现,如果val被绑定。然后,外部查询将从每个组中选择第一条记录。 ** real ***'id'值是什么样的?在'-'之前是否可以有三个以上的字符?如果是这样,'SUBSTRING(id,1,3)'需要改变以匹配数据的行为。 – MatBailie 2012-03-16 14:29:01

+0

Thx - great :-) – 2012-03-16 14:31:18

0
SELECT SUBSTRING(id,1,3),MIN(val) FROM Table1 GROUP BY SUBSTRING(id,1,3); 

你被同时使用SUBSTRING分组的列( ID,1,3),而不仅仅是SUBSTRING(ID,1,3)。它工作得很好。请查看以下链接中的相同示例。

http://sqlfiddle.com/#!3/fd9fc/1

+0

除了OP需要结果中的整个***'id',而不仅仅是substring()。而且'id'必须是对应于'MIN(val)'的那个。 – MatBailie 2012-03-16 14:12:47