#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
ID UserId Name Amount RewardId
----------------------------
1 1 James 10.00 1
2 1 James 10.00 2
3 1 James 10.00 3
4 2 Dave 20.00 1
5 2 Dave 20.00 3
6 3 Lim 15.00 2
Я пытаюсь вставить в другую таблицу, и это результат, с которым я борюсь:
Tbl1ID RewardId
------------------
1 1
1 2
1 3
4 1
4 3
6 2
Я пытаюсь получить MIN (ID) каждого пользователя и выбрать все идентификаторы вознаграждений, которые принадлежат этому человеку.
Комментарии:
1. Какой запрос вы пытаетесь использовать в данный момент?
2. Что пробовали до сих пор и в чем была проблема?
3. Если вы
select min(id) as id
, как вы предлагаете, тогдаgroup by rewardId
это должно дать вам то, что вы хотите. Посколькуrewardid
он не уникален, он предоставит вам 3 строки, каждая из которых содержитminid
4. Выберите MIN(Id), ??? Из группы Tbl1 по имени Amount понятия не имеет, как получить вознаграждение. Если я сгруппирую по, результат будет неправильным
Ответ №1:
Вы могли бы выполнить простое самосоединение, чтобы получить минимальное значение идентификатора для каждой комбинации userid / rewardid;
SELECT MIN(a.id) Tbl1ID, b.RewardId
FROM mytable a
JOIN mytable b
ON a.name = b.name
GROUP BY b.userid, b.rewardid
ORDER BY tbl1id, rewardid;
Ответ №2:
Если вы используете SQL Server 2008 , вы можете упростить его с помощью функции Window .
INSERT INTO AnotherTable (Tbl1ID, RewardID)
SELECT MIN(ID) OVER (PARTITION BY Name),
RewardID
FROM SourceTable
Комментарии:
1. Пытаюсь найти ваше решение. Не слишком уверен, как работает разделение по. 🙂
Ответ №3:
Попробуйте это
SELECT tbl1id,RewardID From
table1 S JOIN
(
SELECT MIN(ID) as tbl1id,Name FROM table1 GROUP BY Name
) T ON T.Name = S.Name
ORDER BY tbl1id
Вывод:
Tbl1ID RewardId
----------------
1 1
1 2
1 3
4 1
4 3
6 2
Если вы хотите вставить в новую таблицу, попробуйте это
Insert into Newtable (tbl1id,RewardID)
SELECT tbl1id,RewardID from
table1 S JOIN
(
SELECT MIN(ID) as tbl1id,Name
FROM table1
GROUP BY Name
) T ON T.Name = S.Name
ORDER BY tbl1id;