如何从SQLite中的聚合函数返回关系

如何从SQLite中的聚合函数返回关系,sql,sqlite,Sql,Sqlite,我有一个家庭作业问题,要求我返回一个人最大的孩子的名字,如果是领带,则返回所有领带 数据库的架构为: create table persons ( fname char(12), lname char(12), bdate date, bplace char(20), address char(30), phone char(12), primary key (fname, lname) ); create table bi

我有一个家庭作业问题,要求我返回一个人最大的孩子的名字,如果是领带,则返回所有领带

数据库的架构为:

create table persons (
  fname     char(12),
  lname     char(12),
  bdate     date,
  bplace    char(20), 
  address   char(30),
  phone     char(12),
  primary key (fname, lname)
);
create table births (
  regno     int,
  fname     char(12),
  lname     char(12),
  regdate   date,
  regplace  char(20),
  gender    char(1),
  f_fname   char(12),
  f_lname   char(12),
  m_fname   char(12),
  m_lname   char(12),
  primary key (regno),
  foreign key (fname,lname) references persons,
  foreign key (f_fname,f_lname) references persons,
  foreign key (m_fname,m_lname) references persons
);
我现在的问题是


SELECT fname, lname, min(bdate)
from (SELECT *
    from persons
    JOIN births using (fname, lname)
    WHERE f_fname='Michael' and f_lname='Fox');
迈克尔·福克斯就是那个被质疑的人。预期产量为

Q4|MFOld
Q4|MFOld2
然而,我只能得到第一个最大的孩子。我尝试使用With语句,但不允许使用视图或临时表来回答此问题。我还研究了使用Rank,但据我所知,这是insqlite v3.25引入的,但这个问题将使用v3.11进行测试。关于如何返回领带有什么见解吗?

您可以使用RANK:

如果您需要删除where子句以获得每个人的最年长子女,则需要添加一个use a分区:

在SQLite<3.25中,如果RANK等窗口函数不可用,则可以使用自3.8版以来可用的通用表表达式来提取Michael Fox的所有子项,并使用not EXISTS来筛选最早的子项:

WITH cte AS (
    SELECT b.fname, b.lname, p.bdate
    FROM persons p
    JOIN births b using (fname, lname)
    WHERE b.f_fname = 'Michael' AND b.f_lname = 'Fox'
)
SELECT *
FROM cte c
WHERE NOT EXISTS (
    SELECT 1 FROM cte c1 WHERE c1.bdate < c.bdate
)

为什么需要最小值,因为没有分组,所以所有行的最小值都是相同的,只需将其替换为正常日期即可

   SELECT fname, lname, b_date, 
   row_number() over (partition by b_date 
    order by fname, lname) 
   from (SELECT *
  from persons
 JOIN births using (fname, lname)
 WHERE f_fname='Michael' and 
  f_lname='Fox');

你有没有用不同的账户,或者那是你的同学?如果是这样的话,您应该比较注释。尝试了这种逐字逐句的方式,sqlite返回的结果是:错误:靠近第1行:语法错误。@cs\u pool\u besty:您使用的是哪个版本的sqlite?我使用的是第3行。11@cs_pool_besty:RANK仅从版本3.25起可用。我为早期版本添加了一个解决方案。不过,我们也不打算使用临时表来解决这个问题。
WITH cte AS (
    SELECT b.fname, b.lname, p.bdate
    FROM persons p
    JOIN births b using (fname, lname)
    WHERE b.f_fname = 'Michael' AND b.f_lname = 'Fox'
)
SELECT *
FROM cte c
WHERE NOT EXISTS (
    SELECT 1 FROM cte c1 WHERE c1.bdate < c.bdate
)
   SELECT fname, lname, b_date, 
   row_number() over (partition by b_date 
    order by fname, lname) 
   from (SELECT *
  from persons
 JOIN births using (fname, lname)
 WHERE f_fname='Michael' and 
  f_lname='Fox');