【发布时间】:2017-09-21 11:10:49
【问题描述】:
我有一个存储成员列表的表 - 为简单起见,我将使用一个简单的真实案例来模拟我的用例。
让我们使用体育俱乐部或健身房的类比。
健身房的会员每三个月更换一次(例如) - 一些老会员离开,一些新会员加入,一些会员保持不变。
我想在表格上运行一个查询 - 跨越多个时间段并返回俱乐部中所有成员的平均体重。
这些是我到目前为止想出的表格:
-- A table containing all members the gym has ever had
-- current members have their leave_date field left at NULL
-- departed members have their leave_date field set to the days they left the gym
CREATE TABLE IF NOT EXISTS member (
id PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
join_date DATE NOT NULL,
-- set to NULL if user has not left yet
leave_date DATE DEFAULT NULL
);
-- A table of members weights.
-- This table is populated DAILY,after the weights of CURRENT members
-- has been recorded
CREATE TABLE IF NOT EXISTS current_member_weight (
id PRIMARY KEY NOT NULL,
calendar_date DATE NOT NULL,
member_id INTEGER REFERENCES member(id) NOT NULL,
weight REAL NOT NULL
);
-- I want to write a query that returns the AVERAGE daily weight of
-- CURRENT members of the gym. The query should take a starting_date
-- and an ending_date between which to calculate the daily
-- averages. The aver
-- PSEUDO SQL BELOW!
SELECT calendar_date, AVG(weight)
FROM member, current_member_weight
WHERE calendar_date BETWEEN(starting_date, ending_date);
我有两个问题:
- 能否改进上述架构 - 如果可以,请说明
- 如何编写 SQL* 查询以返回在指定时间段 (t1, t2) 内为健身房中所有成员计算的平均权重,其中 (t1,t2) 跨越成员加入/离开健身房的时间段?
[[关于 SQL 的注意事项]]
最好,任何显示的 SQL 都与数据库无关,但如果要使用特定风格的 SQL,我更喜欢 PostgreSQL,因为这是我正在使用的数据库。
【问题讨论】:
-
我会更改表名并删除第三个表,因为您可以查询该表,并且一旦存储它就会过时。
-
@juergend 按照您的建议删除了第三张表,以澄清问题。关于更改表名 - 您建议使用什么名称?
-
其实我不知道member和gym_member的区别。也许使用用户和会员。会员有一个更好的词,但我现在想不起来了
-
您不清楚您的表中有什么或您想要什么查询结果。请完成这些句子:行 (id, name, ...) is in Member when person id has name name i> ... 并在 leave_date 离开或没有离开且 leave_date 为空;当 ... 时,行 (id, ...) 在 Gym_Member 中;行(calendar_date,weight)在查询结果中当某人id ...”。PS如果一个人离开并重新加入怎么办? PPS“基本上”当不在其他地方总结清晰时是一个华夫格词,意思是“不”,当一个人知道或怀疑一个人还没有时,它可以让一个人假装自己已经足够清楚了。
-
@philipxy 具有讽刺意味的是,我也不明白你的意思。能否请您转录以下语句:“基本上”当不在其他地方总结清晰时是一个华夫格词,意思是“不”,当一个人知道或怀疑自己还没有时,它可以让一个人假装自己已经足够清楚了。” 请翻译成英文?
标签: sql database postgresql database-design