0

我按日期对行进行排序。如果我想选择最后一列中具有唯一值的每一行,我可以用 sql 执行此操作吗?

所以我想选择第一行,第二行,第三行不,第四行我想选择,依此类推。

在此处输入图像描述

4

3 回答 3

3

您想要的不是唯一的行,而是每组一个。这可以通过使用MIN(pk_artikel_Id)and来完成GROUP BY fk_artikel_bron。此方法使用IN子查询来获取每个唯一的第一个pk_artikel_id及其关联的列,然后使用它来获取外部查询中的剩余列。fk_artikel_bronfk_artikel_bron

SELECT * FROM tbl 
WHERE pk_artikel_id IN
  (SELECT MIN(pk_artikel_id) AS id FROM tbl GROUP BY fk_artikel_bron)

尽管 MySQL 最初允许您在SELECT列表中添加其余列,避免使用IN子查询,但这并不能真正移植到其他 RDBMS 系统。这种方法更通用一点。

它也可以通过JOIN针对子查询来完成,这可能会更快,也可能不会更快。很难说没有基准测试。

SELECT * 
FROM  tbl
  JOIN (
    SELECT 
      fk_artikel_bron, 
      MIN(pk_artikel_id) AS id
    FROM tbl
    GROUP BY fk_artikel_bron) mins ON tbl.pk_artikel_id = mins.id
于 2012-05-08T12:47:58.550 回答
2

这类似于迈克尔的答案,但它使用自联接而不是子查询。试试看它的表现如何:

SELECT * from tbl t1
LEFT JOIN tbl t2
  ON t2.fk_artikel_bron = t1.fk_artikel_bron
  AND t2.pk_artikel_id < t1.pk_artikel_id
WHERE t2.pk_artikel_id IS NULL

如果您有正确的索引,这种类型的连接通常会执行子查询(因为派生表不使用索引)。

于 2012-05-08T12:57:55.600 回答
-1

这种非标准的,仅限 mysql 的技巧将选择遇到的每个值的第一行pk_artikel_bron

select *
...
group by pk_artikel_bron

不管你喜不喜欢,这个查询会产生所要求的输出。

已编辑

我似乎在这里受到了打击,所以这是免责声明:

这仅适用于 mysql 5+

虽然 mysql 规范说使用这种技术返回的行是不可预测的(即你可以得到任何行作为遇到的“第一”行),事实上在我见过的所有情况下,你都会得到第一行选择顺序,因此要获得可在实践中使用的可预测行(但在未来的版本中可能无法使用,但可能会使用),请从有序结果中进行选择:

select * from (
    select *
    ... 
    order by pk_artikel_id) x
group by pk_artikel_bron
于 2012-05-08T12:48:50.903 回答