SQLite - 选择一列的DISTINCT并获取其他列

jav*_*azo 15 sqlite select distinct ios

我有一个这样的表(但有更多列):

Code    Quantity         
-----   --------       
00001      1           
00002      1           
00002      1           
00002      2           
00003      2          
00003      1          
Run Code Online (Sandbox Code Playgroud)

我希望得到与SELECT DISTINCT Code FROM table(00001,00002,00003)相同的结果,但是与所有其他表列相同.

更新:如果我执行此操作:SELECT DISTINCT Code, Quantity from table 我得到:

    Code    Quantity         
    -----   --------       
    00001      1           
    00002      1           
    00002      2           
    00003      1          
    00003      2  
Run Code Online (Sandbox Code Playgroud)

我想得到:

    Code    Quantity         
    -----   --------       
    00001      1           
    00002      1                   
    00003      1 
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Gor*_*off 28

假设您正在使用MySQL(因为标记了问题),以下内容将返回其他列的任意值:

select *
from t
group by code;
Run Code Online (Sandbox Code Playgroud)

但是,选择的特定值来自不确定的行.

  • 问题是SQLite; 答案是一样的. (2认同)

Cir*_*四事件 12

SQLite 确定性min/max

为了还保证您将获得所需输出中确定性的最小数量的行,您可以简单地将其添加到min(quantity)选择中,如下所示:

select *, min(quantity)
from t
group by code;
Run Code Online (Sandbox Code Playgroud)

如所述:每组具有最大值的行 - SQLite

SQLite 文档保证这有效https://www.sqlite.org/lang_select.html#bareagg

当聚合函数为 min() 或 max() 时,会进行特殊处理。例子:

SELECT a, b, max(c) FROM tab1 GROUP BY a;
Run Code Online (Sandbox Code Playgroud)

当在聚合查询中使用 min() 或 max() 聚合函数时,结果集中的所有裸列都会从也包含最小值或最大值的输入行获取值。

这是一个 SQL 扩展,不能跨 RDMS 移植。

PostgreSQLDISTINCT ON

在 PostgreSQL 13.5 中,您无法按既不是聚合也不是 PRIMARY 的列进行 GROUP:选择每个 GROUP BY 组中的第一行?

但是 PostgreSQL 的SELECT DISTINCT ON扩展可以很好地解决用例: https: //www.postgresql.org/docs/9.3/sql-select.html#SQL-DISTINCT,因为它允许您分别指定需要区分的内容和需要的内容待退回:

select distinct on (code) *
from t
group by code
order by code ASC, quantity ASC
Run Code Online (Sandbox Code Playgroud)

此查询还将确定性地选择数量最低的条目,因为order by在选择要选择的列时会受到尊重。

SELECT DISTINCT ON在 SQLite 中 WONTFIXed: https: //code.djangoproject.com/ticket/22696虽然两个 DBMS 都可以实现这个简单的情况,但SELECT DISTINCT它比当前 SQLite 的神奇最小值/最大值更通用,例如,它可以处理 SQLite 所说的多个列其实施是不可能的。

RANKROW_NUMBER窗口函数适用于 SQLite 和 PostgreSQL

这种方法是迄今为止我见过的最通用的方法,完全相同的代码适用于 SQLite 和 PostgresSQL:

SELECT *
FROM (
    SELECT
      ROW_NUMBER() OVER (
        PARTITION BY "name"
        ORDER BY "population" DESC
      ) AS "rnk",
      *
    FROM "table"
    WHERE "name" IN ('a', 'b', 'c')
  ) sub
WHERE "sub"."rnk" = 1
ORDER BY
  "sub"."name" ASC,
  "sub"."population" DESC
Run Code Online (Sandbox Code Playgroud)

完全相同的代码适用于两者:

此外,我们可以轻松修改该查询以涵盖以下相关用例:

  • 如果替换ROW_NUMBER()为,则如果多行达到最大值,RANK()它将返回所有关系max
  • 如果你"sub"."rnk" = 1用替换,"sub"."rnk" <= n你可以获得每组的前 n 个,而不仅仅是前 1 个

我们需要在代码中执行子查询,您不能WHERE "sub"."rnk" = 1在您正在执行的同一查询中执行子查询ROW_NUMBER没有子查询的窗口函数分区和顺序


小智 6

在戈登的答案的基础上,您可以订购一个子查询,以便分组依据始终返回每个代码的最低数量。

select *
from (select * from t order by code desc, quantity asc)
group by code;
Run Code Online (Sandbox Code Playgroud)