получить номер строки записи в результирующем sql сервере - PullRequest
2 голосов
/ 03 ноября 2010

У меня есть таблица, полная документов с серийными номерами - столбцы:

  • docid int
  • написание текста
  • submissionDate datetime

... и я хотел бы узнать, где находится конкретный серийный номер в запросе к таблице.

Например, если я упорядочил набор результатов по submissionDate asc, я мог бы узнать, где находится документ 34 в этом порядке (т. Е. Находится ли он в позиции 11?)

Как мне это сделать?

Ответы [ 3 ]

5 голосов
/ 03 ноября 2010

SQL Server 2005+, с использованием аналитических функций:

SELECT t.docid,
       t.writing,
       t.submissiondate,
       ROW_NUMBER() OVER(ORDER BY t.submissiondate) AS position
  FROM YOUR_TABLE t

Не аналитическая версия

При таком подходе существует риск непоследовательных значений, потому что, если есть две (или более) записи с одинаковым значением submissiondate - все они будут иметь одинаковое значение позиции. Это наравне с использованием аналитических функций RANK или DENSE_RANK, поскольку ROW_NUMBER всегда будет предоставлять уникальное значение для каждой записи без учета дублирующих значений.

SELECT x.docid,
       x.writing,
       x.submissiondate,
       (SELECT COUNT(*)
          FROM YOUR_TABLE y
         WHERE y.submissiondate <= x.submissiondate) AS position
  FROM YOUR_TABLE x
2 голосов
/ 03 ноября 2010

Похоже, вы пытаетесь получить номер строки, даже если это не одна из возвращаемых строк. Для этого вы можете использовать CTE:

;WITH CTE AS
(
    SELECT
        docid,
        writing,
        submissionDate,
        ROW_NUMBER() OVER (ORDER BY submissionDate) AS position
    FROM
        My_Table
)
SELECT
    docid,
    writing,
    submissionDate,
    position
FROM
    CTE
WHERE
    docid = 34

Конечно, для этого также требуется SQL Server 2005 или выше.

2 голосов
/ 03 ноября 2010

Вы можете использовать функцию окна rank().

Пример ( от MSDN ):

SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
    ,RANK() OVER (ORDER BY i.Quantity DESC) AS 'RANK'
  FROM Production.ProductInventory i 
 INNER JOIN Production.Product p  ON i.ProductID = p.ProductID
 ORDER BY p.Name;

Это очень мощный.

ЭтоСтандарт SQL, и он должен работать в SQL Server 2005 и более новых версиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...