我有一个表,我希望从中选择一个列的子集,但最后根据您在队列中的位置添加一个计算列。有以下字段(相关):
id:int,auto increment,primary key answertime:datetime,nullable
默认情况下,当某些内容提交到队列时,其answertime为NULL。所以,我希望选择队列中的东西的ID以及它在队列中的排名(即排名1是未答复的下一个项目等)。这就是我的想法:
rank - id - COUNT(我的id下面的id,其中answertime不为null)。但是,我遇到了此查询语法的问题:
SELECT id AS outerid, COUNT(
SELECT * FROM tablename WHERE id<outerid AND answertime IS NOT NULL
)
FROM tablename
WHERE answertime IS NULL;
现在,显然,这是错误的,因为我非常有信心你不能在聚合函数中嵌入一个select,同样翻转SELECT和COUNT不起作用,因为你不能在那个时候嵌入SELECT在代码中(它只能在WHERE子句中使用)。
这甚至可以用SQL做,还是需要在程序端添加一些逻辑?
如果它有帮助,我在SQL Server 2008上这样做,虽然我怀疑这会增加任何价值。
答案 0 :(得分:3)
您可以这样做,您只是不能在聚合子查询中使用SELECT *
。试试这个,它将COUNT
值作为标量结果:
SELECT
id AS outerid,
(SELECT COUNT(Id) FROM tablename
WHERE id<outie.id AND answertime IS NOT NULL)
FROM tablename outie
WHERE answertime IS NULL;
根据您的真实情况,您可能需要在使用COUNT(*)
,COUNT(Id)
或其他列之间自行选择。
答案 1 :(得分:1)
SELECT id AS outerid,
(SELECT COUNT(*) FROM tablename WHERE id < outerid AND answertime IS NOT NULL) AS othercol
FROM tablename -- ?
WHERE answertime IS NULL;
另外,FROM语句在哪里?
答案 2 :(得分:0)
根据@HLGEM的建议,您可以使用ROW_NUMBER()
来获取结果。该方法涉及将tablename
中的行按id
排序,而不将{em>和按id
分区,并按answertime
进行分区。 answertime
为NULL的每一行的排名之间的差异将为您提供与使用子查询中的COUNT()
计算的值相同的值。
以下是该方法的实现:
;
WITH ranked AS (
SELECT
*,
Rnk = ROW_NUMBER() OVER ( ORDER BY id),
PartRnk = ROW_NUMBER() OVER (PARTITION BY answertime ORDER BY id)
FROM tablename
)
SELECT
id, /* AS outerid, if you like */
Cnt = Rnk - PartRnk
FROM ranked
WHERE answertime IS NULL