2

我有一个表,我希望从中选择列的子集,但还要根据您在队列中的位置添加一个计算列。有以下字段(相关):

id: int, 自增, 主键 answertime: datetime, nullable

默认情况下,当某些内容提交到队列时,其应答时间为 NULL。所以,我希望选择队列中事物的 ID 以及它在队列中的排名(即排名 1 是下一个未回答的项目,等等)。这就是我的想法:

rank - id - COUNT(回答时间不为空的我的 id 以下的 id)。但是,我对此查询的语法有疑问:

SELECT id AS outerid, COUNT(
    SELECT * FROM tablename WHERE id<outerid AND answertime IS NOT NULL
)
FROM tablename 
WHERE answertime IS NULL;

现在,显然,这是错误的,因为我相当有信心您不能在聚合函数中嵌入选择,同样翻转 SELECT 和 COUNT 不起作用,因为您不能在代码中嵌入 SELECT (它只能在 WHERE 子句中使用)。

这甚至可以用 SQL 来完成,还是我需要在程序端添加一些逻辑?

如果有帮助,我将在 SQL Server 2008 上执行此操作,尽管我怀疑这会增加任何价值。

4

3 回答 3

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)具体取决于您真正追求的内容。

于 2012-01-20T19:26:05.620 回答
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 语句在哪里?

于 2012-01-20T19:27:45.530 回答
0

正如@HLGEM 所建议的,您可以使用它ROW_NUMBER()来获取您的结果。该方法涉及tablename通过id不分区id分区对中的行进行排序answertime。为 NULL的每一行的排名之间的差异将为您提供与您在子查询answertime中使用的计算相同的值。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
于 2012-01-20T21:54:57.880 回答