Я посмотрел ответы на подобные вопросы, но мне не удалось перевести подход OVER () / ROWNUMBER () к моей проблеме.
У меня есть таблица, которая содержит следующие столбцы:
CREATE TABLE [dbo].[Problem](
[UniqueId] [int] NOT NULL,
[Attribute1] [int] NOT NULL,
[Attribute2] [int] NULL,
[Attribute3] int NULL,
[Attribute4] int NULL,
[Attribute5] [money] NULL,
[Attribute6] [varchar](50) NULL,
) ON [PRIMARY]
Проблема состоит в том, чтобы определить процентное содержание случаев, когда «Атрибут6» заполняется для набора строк, когда их больше, чем1 значение для «Attribute5», когда «Attibute1» - «Attribute4» были одинаковыми.Моим первым шагом было получить делитель (примерный кадр), который, как мне кажется, запечатлен с помощью следующего кода (включенного, чтобы вы могли видеть мое мышление):
SELECT SUM(Number) AS Divisor
FROM (
SELECT Attribute1, Attribute2, Attribute3, Attribute4, COUNT(*) AS Number
FROM (
SELECT Attribute1, Attribute2, Attribute3, Attribute4, Attribute5
FROM dbo.Problem
GROUP BY Attribute1, Attribute2, Attribute3, Attribute4, Attribute5
) AS levelOne
GROUP BY Attribute1, Attribute2, Attribute3, Attribute4
HAVING COUNT(*) > 1
) AS levelTwo
Затем я получаю Дивиденд (считайте где Аттибут 6заполняется в рамке образца).Это представляло проблему, потому что я не мог включить атрибут 6 в GROUP BY, но мне нужно было его изучить.Я применил хак, используя MAX () для включения UniqueId, а затем выполнил самостоятельное СОЕДИНЕНИЕ.Не рад этому подходу.
SELECT SUM(Number) AS Dividend
FROM (
SELECT MAX(UniqueId) AS UniqueId, Attribute1, Attribute2, Attribute3, Attribute4, COUNT(*) AS Number
FROM (
SELECT MAX(UniqueId) AS UniqueId, Attribute1, Attribute2, Attribute3, Attribute4, Attribute5
FROM dbo.Problem
GROUP BY Attribute1, Attribute2, Attribute3, Attribute4, Attribute5
) AS levelOne
GROUP BY Attribute1, Attribute2, Attribute3, Attribute4, Attribute5
HAVING COUNT(*) > 1
) AS levelTwo
INNER JOIN dbo.Problem p
ON p.UniqueId = levelTwo.UniqueId
WHERE p.Attribute6 IS NOT null
Возвращенные цифры проходят тест на прослушивание, но я хотел проверить его.Последние несколько часов были потрачены на создание запроса, возвращающего все столбцы для набора Дивидендов.Я надеюсь, что такой запрос также станет лучшей основой для запросов на дивиденды / делители.Я знаю, что это кажется длинным, так что даже советы будут оценены.
Вот некоторые примеры данных.
INSERT INTO Problem VALUES (8, 17, 1, 99213, 59.85, 'A')
INSERT INTO Problem VALUES (8, 17, 1, 90658, 12.61, '')
INSERT INTO Problem VALUES (8, 17, 1, 90658, 12.56, '')
INSERT INTO Problem VALUES (8, 17, 1, 87880, 10.51, '')
INSERT INTO Problem VALUES (8, 17, 1, 87880, 4.65, 'A')
INSERT INTO Problem VALUES (8, 17, 2, 99399, 104.57, 'B')
INSERT INTO Problem VALUES (8, 17, 2, 90460, 22.51, '')
INSERT INTO Problem VALUES (8, 17, 2, 90460, 25.54, 'A')
INSERT INTO Problem VALUES (8, 17, 2, 99391, 125.55, 'A')
INSERT INTO Problem VALUES (8, 17, 2, 99391, 104.57, 'B')
INSERT INTO Problem VALUES (8, 17, 2, 99391, 104.57, 'B')
INSERT INTO Problem VALUES (8, 18, 2, 90460, 25.51, 'B')
INSERT INTO Problem VALUES (8, 18, 2, 90744, 25.54, 'B')
В этом наборе из 13 строк ответ составляет 77,78% (7 из 9).Строки 2 + 3 представляют собой группу из 8 - 17 - 1 - 90658 с несколькими значениями для атрибута 5, поэтому является частью выборочного кадра (делителя), но не имеет нескольких значений для атрибута 6, поэтому не является частью ответа (дивиденды).Строки 4 + 5, 7 + 7 и 9 + 10 + 11 соответствуют обоим тестам.Спасибо за вклад!