SQL中的计算列有问题
我有一个表,我希望从中选择列的子集,但还要根据您在队列中的位置在表的末尾添加一个计算列。有以下相关字段: id:int,自动递增,主键 应答时间:日期时间,可为空 默认情况下,当某个内容提交到队列时,其应答时间为空。因此,我希望选择队列中事物的ID及其在队列中的排名,即排名1是下一个未回答的项目,等等。我的想法如下: rank-id-countid在我的id下,应答时间不为空。但是,我对这个查询的语法有一个问题:SQL中的计算列有问题,sql,sql-server-2008,calculated-columns,nested-queries,Sql,Sql Server 2008,Calculated Columns,Nested Queries,我有一个表,我希望从中选择列的子集,但还要根据您在队列中的位置在表的末尾添加一个计算列。有以下相关字段: id:int,自动递增,主键 应答时间:日期时间,可为空 默认情况下,当某个内容提交到队列时,其应答时间为空。因此,我希望选择队列中事物的ID及其在队列中的排名,即排名1是下一个未回答的项目,等等。我的想法如下: rank-id-countid在我的id下,应答时间不为空。但是,我对这个查询的语法有一个问题: SELECT id AS outerid, COUNT( SELECT *
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实现,还是需要在程序端添加一些逻辑
如果有帮助的话,我会在SQLServer2008上这样做,尽管我怀疑这会增加任何价值 可以这样做,但不能在聚合子查询中使用SELECT*。尝试此操作,它将计数值作为标量结果获取:
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*、COUNTId或其他列之间进行选择,具体取决于您真正想要的内容。您可以这样做,但不能在聚合子查询中使用SELECT*。尝试此操作,它将计数值作为标量结果获取:
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;
SELECT id AS outerid,
(SELECT COUNT(*) FROM tablename WHERE id < outerid AND answertime IS NOT NULL) AS othercol
FROM tablename -- ?
WHERE answertime IS NULL;
您可能需要自己选择使用COUNT*、COUNTId或其他列,具体取决于您真正想要的内容
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语句在哪里
另外,FROM语句在哪里?正如@HLGEM所建议的,您可以使用ROW_NUMBER来获得结果。该方法包括按id对tablename中的行进行排序,不进行分区,按id对tablename中的行进行排序,并按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
正如@HLGEM所建议的,您可以使用ROW_NUMBER来获得结果。该方法包括按id对tablename中的行进行排序,不进行分区,按id对tablename中的行进行排序,并按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
没有时间给出一个很好的例子,但要查找行数函数。如果我理解正确,我想这将是你想要的。没有时间给出一个好的例子,但查找行数函数。如果我理解正确,我想这将是你想要的;我漏掉了表名outie位,因此它可以区分ID。谢谢或者从tablename中选择COUNTanswertime,其中id