Я пытаюсь выяснить, какие значения пользователь меняет больше всего. У меня есть таблица пользователей, как это:
Это пользовательская таблица, в которой записи не изменяются. Если пользователь что-то меняет, создается новая запись для отслеживания того, что меняют пользователи.
Теперь я хочу получить что-то вроде этого:
Я хочу, чтобы имена столбцов (электронная почта, телефон и т. д.) были значениями, чтобы я мог сортировать.
Кто-нибудь знает, как я могу это сделать, пожалуйста?
Обновлено: я использую SSMS и T-SQL
@jarlh Мне не разрешено вносить изменения в БД.
@LucienRyter: SSMS не является «базой данных» или «СУБД». Это приложение, которое может подключаться к базе данных SQL Server для выполнения операторов SQL, и оно не имеет отношения к вопросу.
@LucienRyter вы не могу обнаруживаете изменения данных без включения отслеживание изменений, добавления триггеров в таблицу или использования таблицы с системной версией.
Отслеживание изменений очень легкое, работает во всех версиях и выпусках и может возвращать либо измененные идентификаторы, либо все строки с момента последнего изменения. Это также прозрачно для таблиц и приложений. Триггеры требуют добавления дополнительных таблиц и т. д. Для таблиц с системной версией требуется SQL Server 2016 или более поздней версии.
Я не могу понять взаимосвязь между желаемыми результатами и данными выборки.
@GordonLinoff Проверьте, например, значения NumberOfKids. Он подсчитывает, сколько раз люди меняли это значение. Первая запись не считается (FirstEntry bool)
Обычно нас не волнует общее изменение с начала времен (или когда мы начали отслеживать такие вещи), нас интересует тенденция во времени (и, возможно, пики). Подумайте о том, что вы измеряете, как вы это записываете и как вы собираетесь использовать эту информацию.


Выглядит ужасно, но работает:
select * into #q1 from (SELECT Row_number()OVER(ORDER BY i.CreationDate) rn, i.Email, i.Phone, i.Address, i.Phone, i.NumberOfKids
FROM user i) as t
SELECT Sum(CASE WHEN a.Email= b.Email THEN 0 ELSE 1 END) as Amount, 'Email' as ColumnName
FROM #q1 a
JOIN #q1 b
ON a.UserID= b.UserID
UNION ALL
SELECT Sum(CASE WHEN a.Address= b.Address THEN 0 ELSE 1 END) as Amount, 'Address' as ColumnName
FROM #q1 a
JOIN #q1 b
ON a.UserID= b.UserID
UNION ALL
SELECT Sum(CASE WHEN a.Phone= b.Phone THEN 0 ELSE 1 END) as Amount, 'Phone' as ColumnName
FROM #q1 a
JOIN #q1 b
ON a.UserID= b.UserID
UNION ALL
SELECT Sum(CASE WHEN a.NumberOfKids= b.NumberOfKids THEN 0 ELSE 1 END) as Amount, 'NumberOfKids' as ColumnName
FROM #q1 a
JOIN #q1 b
ON a.UserID= b.UserID
order by Amount desc
drop table #q1
Только если реальный вопрос отличается от того, что вы задали. Вам вообще не нужен UNION, просто самосоединение Один, WHERE которое проверяет, не изменились ли какие-либо другие поля.
У меня была бы таблица пользователей с одной строкой для каждого пользователя, в которой хранятся текущие значения. Тогда у меня будет триггер для регистрации изменений (одна строка на изменение, в которой хранятся как старые, так и новые значения).