我是一个相对的SQL初学者,我不完全知道如何问我在问什么(所以我也不完全知道如何搜索帮助它)。SQL SELECT与GROUP BY,指向组
我想使用SELECT
语句,该语句使用GROUP BY
子句按特定属性进行分组,并且同时返回到该组所选的行。有没有办法做到这一点? (我正在使用,FWIW,SQLite3,但我认为这更多是一个通用SQL语法的问题。)
我有一个表其中我有关于人和家庭的数据。每一行都是一个人,每个人都被分为一到十几个家庭。
每个家庭中的一个人(通常是第一个人,由uid
)是户主,并且具有head
列设置。我想GROUP BY
列household_id
,并且还选择组的每个成员谁是“头”uid
。有没有办法用一个陈述来做到这一点?
这是我有:
SELECT DISTINCT household_id,
COUNT(uid) AS members /* The number of members in each household; it works */,
(SELECT uid FROM "group" WHERE head == 1) /* Only I don't know how to do this */
FROM population GROUP BY household_id;
我想这样的事情,并没有给我什么,我想:
SELECT DISTINCT household_id,
COUNT(uid) AS members,
(SELECT uid FROM population WHERE household_id == household_id AND head == 1) /* <-- here */
FROM population GROUP BY household_id;
但是,这当然是挑选的第一行中household_id
是household_id
;即表格中的第一行。我该如何参考household_id
这个特定组中的DISTINCT
?
任何提示?提前致谢。
谢谢!这很有效,但为什么,我仍然在挠头。让我直截了当地说:对于组中的每个成员,您的子句将“head_id”设置为1(如果“head”== 1)或NULL。然后它找到该组的MAX,并且由于组中的每个人除了头部之外都是NULL,它只会选择1的人(NULL接收到底部)。 – LonelyPilgrim 2013-02-28 17:10:53
你是对的。我不必解释一下'COUNT()',因为我知道你已经知道了。你对这一行感到困惑:'MAX(case when head = 1 THEN uid ELSE NULL END)'right?请记住,您正在通过'household_id'汇总记录,因此它会在搜索“head = 1”的所有记录上运行。如果找到了,那么某个列的值就是'uid',否则'null'。为了完全理解,执行这个查询,'SELECT household_id,CASE when head = 1 THEN uid ELSE NULL END as HeadID FROM population'。 – 2013-02-28 17:16:01
谢谢;是的,这是我不确定的路线。我现在明白了。 – LonelyPilgrim 2013-02-28 17:18:21