如何从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');