Intereting Posts
Hibernate 'Inverse' в файле сопоставления Как присоединиться к двум объектам, основанным на условии NOT выберите запрос в список на один столбец Улучшение скорости запросов: простой SELECT в большой таблице postgres В чем разница между разделенными запятыми соединениями и присоединением к синтаксису в MySQL? android cursor.moveToNext ()? Написание подпрограммы для создания последовательных записей Вставить запрос вставки как SQL Как бороться с взаимно рекурсивными вставками Использует ли "НЕ СУЩЕСТВУЮЩИЙ", который считается плохой практикой SQL? Поиск вложенного SQL-декодера или переформатирования Oracle получает число DISTINCT с CLOB в запросе .Net – Создание набора записей по требованию, а не простое извлечение всего в память Как отображать строки, которые при объединении равны нулю MySQL только вставляет новую строку, если комбинация столбцов (которые позволяют дубликаты) уникальна

Как объединить около одного элемента SQL?

У меня есть данные в базе данных:

id user 1 zhangsan 2 zhangsan 3 zhangsan 4 lisi 5 lisi 6 lisi 7 zhangsan 8 zhangsan 

Я хочу сохранить порядок и объединить около тех же элементов пользователя, как это сделать? Когда я использую сценарий оболочки, я буду (данные в файле test.):

 cat test|cut -d " " -f2|uniq -c 

это даст результат как:

  3 zhangsan 3 lisi 2 zhangsan 

Но как это сделать, используйте sql?

Если вы пытаетесь:

 SET @name:='',@num:=0; SELECT id, @num:= if(@name = user, @num, @num + 1) as number, @name := user as user FROM foo ORDER BY id ASC; 

Это дает:

 +------+--------+------+ | id | number | user | +------+--------+------+ | 1 | 1 | a | | 2 | 1 | a | | 3 | 1 | a | | 4 | 2 | b | | 5 | 2 | b | | 6 | 2 | b | | 7 | 3 | a | | 8 | 3 | a | +------+--------+------+ 

Итак, вы можете попробовать:

 SET @name:='',@num:=0; SELECT COUNT(*) as count, user FROM ( SELECT @num:= if(@name = user, @num, @num + 1) as number, @name := user as user FROM foo ORDER BY id ASC ) x GROUP BY number; 

Который дает

 +-------+------+ | count | user | +-------+------+ | 3 | a | | 3 | b | | 2 | a | +-------+------+ 

(Я назвал свой стол foo а также просто использовал имена a и b потому что мне было слишком лениво писать zhangsan и zhangsan снова и снова).

если в оракуле вы можете сделать, как показано ниже.

 SELECT NAME, num - lagnum FROM (SELECT lagname, NAME, num, nvl(lag(num) over(ORDER BY num), 0) lagnum FROM (SELECT id, lag(NAME) over(ORDER BY ID) lagname, NAME, lead(NAME) over(ORDER BY ID) leadname, ROWNUM num FROM (SELECT * FROM test ORDER BY ID)) WHERE (lagname = NAME AND (NAME <> leadname OR leadname IS NULL)) OR (lagname IS NULL AND NAME <> leadname) OR (lagname <> NAME AND leadname IS NULL) ORDER BY ID); 

если на сервере sql, oracle, db2 …

  with x as( select c.*, rn = row_number() over (order by c.id) from test c left join test n on c.[user] = n.[user] and c.[id] + 1 = n.[id] where n.id is null ) select a.[user], a.id - coalesce(b.id, 0) from xa left join xb on a.rn = b.rn + 1 

Я думаю, что вы ищете COUNT (ID):

 SELECT COUNT(ID) FROM table GROUP BY user 

Вы не можете сделать это в sql, не делая своего рода последовательный (итеративный) анализ. Помните, что sql задает язык операций.

Небольшое улучшение для выбранного ответа было бы не обязательно определять эти переменные. Таким образом, этот запрос может быть разрешен только в одном заявлении:

 SELECT COUNT(*) cnt, user FROM ( SELECT @num := @num + (@name != user) as number, @name := user as user FROM t, (select @num := 0, @name := '') as s ORDER BY id ) x GROUP BY number 

Вывод:

 | CNT | USER | |-----|----------| | 3 | zhangsan | | 3 | lisi | | 2 | zhangsan | 

Скриншот здесь