SQL Server 2000: длина поля в 1/3 (или 2/3) записей - PullRequest
3 голосов
/ 24 августа 2010

Есть ли более простой / понятный способ сделать это с помощью SQL Server 2000?

Каждые несколько дней мне нужно это делать.

Сначала я посмотрю, сколько у нас записей:

SELECT COUNT(*) FROM MyTable

Затем я перечисляю все длины определенного поля:

SELECT LEN(MyText)
FROM MyTable
ORDER BY LEN(MyText) ASC

Затем мне нужно прокрутить вниз 1/3 пути ... и отметить значение.Затем мне нужно прокрутить вниз на 2/3 пути ... и отметить значение.И, наконец, последнее значение.

Мне нужно выяснить x, y и z:

 33% of the records have this field with a length under x bytes
 66% of the records have this field with a length under y bytes
100% of the records have this field with a length under z bytes

Ответы [ 2 ]

3 голосов
/ 24 августа 2010

В SQL 2005 вы могли бы использовать для этого функции ранжирования.В SQL 2000 я думаю, что вы застряли, делая что-то вроде этого.

DECLARE @RC INT 

CREATE TABLE #lengths
(
id INT IDENTITY(1,1),
[length] INT
)

INSERT INTO #lengths
SELECT LEN(MyText)
FROM MyTable
ORDER BY LEN(MyText) ASC


SET @rc= @@ROWCOUNT

SELECT [length] 
FROM #lengths 
WHERE id IN 
(@rc/3, (2*@rc)/3, @rc)
0 голосов
/ 24 августа 2010

Я думаю, вам нужно что-то вроде этого:

SELECT
 x1.l AS Length,
 x1.n      * 1e2 / (SELECT COUNT(*) FROM MyTable) AS [Percent],
 SUM(x2.n) * 1e2 / (SELECT COUNT(*) FROM MyTable) AS CumPercent
FROM (
 SELECT LEN(MyText) AS l, COUNT(*) AS n
 FROM MyTable
 GROUP BY LEN(MyText)
) AS x1
LEFT JOIN (
 SELECT LEN(MyText) AS l, COUNT(*) AS n
 FROM MyTable
 GROUP BY LEN(MyText)
) AS x2
 ON x2.l <= x1.l
GROUP BY x1.l, x1.n
ORDER BY x1.l
...