SQL. Как выбрать несколько строк с помощью MIN и GROUP BY

#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 понятия не имеет, как получить вознаграждение. Если я сгруппирую по, результат будет неправильным

5. sqlfiddle.com /#!6/1408c/2

Ответ №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;
  

SQLFiddle для тестирования.

Ответ №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;
  

ДЕМОНСТРАЦИЯ СКРИПКИ