-5

编辑:根据下面评论中的@MostyMostacho,这不能用普通的 SQL 来完成。我会保持这个问题的开放,以防它对其他人有用。

我有这张桌子:

+---+---+
| a | b |
+---+---+
| 1 | J |
+---+---+
| 4 | A |
+---+---+
| 1 | A |
+---+---+
| 6 | A |
+---+---+
| 7 | A |
+---+---+
| 3 | A |
+---+---+
| 5 | A |
+---+---+
| 3 | P |
+---+---+
| 4 | P |
+---+---+
| 1 | P |
+---+---+
| 5 | P |
+---+---+
| 6 | P |
+---+---+
| 7 | P |
+---+---+

我想要这个结果:

+---+---+
| a | b |
+---+---+
| 1 | J |
+---+---+
| 4 | A |
+---+---+
| 6 | A |
+---+---+
| 7 | A |
+---+---+
| 3 | A |
+---+---+
| 5 | A |
+---+---+

我想保留第一次出现a并丢弃后续行。

为了实现这一点,我应该执行什么查询?我的 SQL 技能越​​来越生疏了……

4

3 回答 3

1

尝试这个:

SELECT T1.*
FROM myTable T1
WHERE NOT EXISTS(
   SELECT 'NEXT'
   FROM myTable T2
   WHERE T2.a = T1.a
   AND T2.b > T1.a
)

不存在子查询仅获取最后一个,我假设您的订单受 B 列的 ASC 值的限制

于 2013-10-10T16:06:46.733 回答
0

如果没有特定的时间戳或其他单调递增的 id 列,则无法查询表中行的插入顺序;数据库引擎可以自由地以它喜欢的任意顺序返回行,这可能不是行进入的顺序。

因此,对于大多数具有您提供的表模式的 RDBMS,您的建议实际上是不可能的。


但是,如果您有下表:

+-------+-------+--------+
| 编号 | 一个 | 乙|
+-------+-------+--------+
| 1 | 1 | z |
| 2 | 1 | 是 |
| 3 | 1 | x |
| 4 | 2 | 是 |
| 5 | 2 | x |
| 6 | 3 | x |
+-------+-------+--------+

你可以这样做:

SELECT a.A, a.B
FROM Table1 a
INNER JOIN (
    SELECT MIN(id) id
    FROM Table1
    GROUP BY A
) b ON b.id = a.id

SQL Fiddle 演示

于 2013-10-10T16:01:12.270 回答
0
SELECT a.A, a.B
FROM (select @rownum:=@rownum+1 as id, a, b FROM table, (SELECT @rownum:=0) r  ) a
INNER JOIN (
    SELECT MIN(id) id
    FROM (select @rownum:=@rownum+1 as id, a, b FROM table, (SELECT @rownum:=0) r  )
    GROUP BY A
) b ON b.id = a.id
于 2013-10-10T16:05:57.427 回答