powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сгруппировать и вывести. Как?
23 сообщений из 23, страница 1 из 1
Сгруппировать и вывести. Как?
    #40013925
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть огромная таблица из 3 полей

Нужно сгруппировать повторы больше 4 и вывести

Вот так умею:

SELECT u1, MAX(u2), MIN(u2), COUNT(*) FROM u GROUP BY u1 HAVING COUNT(*) > 4

Но оно пишет только Мин u2 и Мах u2 - а мне нужно все

И лучше чтоб в 4 строки.

Спасибо.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40013942
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kompospec,

Исходную таблицу нужно заджойнить на результат вашего запроса...
Или если версия MySQL позволяет - использовать оконные функции
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40013943
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна
kompospec,

Исходную таблицу нужно заджойнить на результат вашего запроса...
Или если версия MySQL позволяет - использовать оконные функции


А кода нельзя привести? Спасибо.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40013946
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kompospec,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select u.*, v.cnt
  from u
  join (
         SELECT u1
              , count(1) as cnt
           FROM u 
          GROUP BY u1 
         HAVING COUNT(1) > 4
        )  as v
    on u.u1 = v.u1



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
/* На версиях от 8.0*/
select u.*
  from (
         SELECT u1
              , count(1) over(partition by u1) as cnt 
           FROM u
        ) as v
 where cnt > 4
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40013952
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна
kompospec,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select u.*, v.cnt
  from u
  join (
         SELECT u1
              , count(1) as cnt
           FROM u 
          GROUP BY u1 
         HAVING COUNT(1) > 4
        )  as v
    on u.u1 = v.u1



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
/* На версиях от 8.0*/
select v.*
  from (
         SELECT u.*
              , count(1) over(partition by u1) as cnt 
           FROM u
        ) as v
 where cnt > 4

Пара опечаток закралось.... "Исправленному - верить"(с)
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40013965
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,

ого! Спасибо огромное. Как проверю - обязательно отпишусь
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014028
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,

Работает!!!
Спасибо огромнейшее.
Первый раз вижу девушку умнее меня.
Спасибо.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014031
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рано я радовался. На локальной, небольшой базе работает, а на сервере - тормознутые-тормоза. Уже 15 мин считает.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014046
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kompospec
а на сервере - тормознутые-тормоза. Уже 15 мин считает.
А создать индекс u(u1) ?
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014088
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
kompospec
а на сервере - тормознутые-тормоза. Уже 15 мин считает.
А создать индекс u(u1) ?


CREATE INDEX u1 ON u(u1);

Ошибка

SQL запрос: Копировать

CREATE INDEX u1 ON u(u1)

Ответ MySQL: Документация
#1170 - Столбец типа BLOB 'u1' был указан в определении ключа без указания длины ключа
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014089
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Что-то я в этих индексах вообще ничего не понял.

Если кто расскажет - то спасиб, большое.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014103
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так поле u1 ещё и текстовое? ну-ну... DDL полный показывайте.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014199
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Так поле u1 ещё и текстовое? ну-ну... DDL полный показывайте.


Я не знаю где брать этот ваш ДДЛ. Структура:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
-- phpMyAdmin SQL Dump
-- version 4.4.15.7
-- http://www.phpmyadmin.net
--
-- Хост: 
-- Время создания: Окт 30 2020 г., 14:07
-- Версия сервера: 5.5.39-cll-lve
-- Версия PHP: 5.3.29

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- База данных: `*******`
--

-- --------------------------------------------------------

--
-- Структура таблицы `u`
--

CREATE TABLE IF NOT EXISTS `u` (
  `id` int(11) NOT NULL,
  `u1` tinytext CHARACTER SET utf8 NOT NULL,
  `u2` tinytext CHARACTER SET utf8 NOT NULL,
  `u3` tinytext CHARACTER SET utf8 NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `u`
--
ALTER TABLE `u`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `u`
--
ALTER TABLE `u`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014206
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
id	u1	u2	u3 	
1627920 	62_68_74_75_80 	28-10-2020-1632 	
1627919 	58_68_74_75_80 	28-10-2020-1632 	
1627918 	58_62_74_75_80 	28-10-2020-1632 	
1627917 	58_62_68_75_80 	28-10-2020-1632 	



Миллион шестьсот записей

u1 - это самый столбец по которому идёт вся работа. Это цифры, в конечном итоге. _ - просто группировка
u2 - Дата - тоже можно взять другой формат
u3 - примечание. Его можно вообще удалить.

Сейчас загрузка по варианту SELECT u1, MAX(u2), MIN(u2), COUNT(*) FROM u GROUP BY u1 HAVING COUNT(*) > 4 - 3 сек

По варианту Анны - 45 сек

Буду очень рад если поможете с любым ускорением.

1 600 000 записей - это только начало.

Спасибо. Огромное.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014383
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u1 определено как tinytext

Переопределите его с указанием макс. длины ( tinytext(255) или менее), и используйте ту же длину префикса при создании индекса.

Хотя я бы рекомендовал подумать насчёт добавить вычисляемое поле, значение которого равно хэшу поля u1 , именно его индексировать и использовать для группировки. Хэш, само собой, подобрать достаточной длины, чтобы не сильно бояться коллизий.

Но всё равно - группировка полутора миллионов записей дело небыстрое.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014384
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Данные в Базу поступают порциями по 16 тысяч записей с одинаковой датой.

Вероятно что не нужно ведь перелопачивать всю таблицу. А можно ведь просто пройтись с новыми данными по старым данным и 1 раз по всей таблице.

Упс. Круто. Я сам до этого додумался?
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014388
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в mySQL есть что то подобное?
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014391
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если поле имеет данные строго по указанному шаблону, типа 58_62_68_75_80 , его можно обжать в достаточно компактный BLOB... а если ещё и количество групп постоянно равно пяти - то и вовсе в BIGINT.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014394
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kompospec
Вероятно что не нужно ведь перелопачивать всю таблицу. А можно ведь просто пройтись с новыми данными по старым данным и 1 раз по всей таблице.

Упс. Круто. Я сам до этого додумался?

kompospec
в mySQL есть что то подобное?

А вот всё это Ваше "тихо сам с собою" - вообще непонятно куда прислонить...
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014438
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
u1 определено как tinytext

Переопределите его с указанием макс. длины ( tinytext(255) или менее), и используйте ту же длину префикса при создании индекса.

Хотя я бы рекомендовал подумать насчёт добавить вычисляемое поле, значение которого равно хэшу поля u1 , именно его индексировать и использовать для группировки. Хэш, само собой, подобрать достаточной длины, чтобы не сильно бояться коллизий.

Но всё равно - группировка полутора миллионов записей дело небыстрое.


Вы знаете - помогло. Точнее стало всё наоборот:

Мой метод стал дольше.
Метод Анны выполняется за 5 сек

А мой почему стал хуже?

Спасибо огромное.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014446
kompospec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что точно стало хуже - запись в базу новых 16 тысяч значений - уже 45 секунд. Ростёт. Было 5 сек.
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40014458
Сотрудник Главного Управления
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kompospec
Спасибо. Огромное.
Такое же огромное, как ваша таблица?
...
Рейтинг: 0 / 0
Сгруппировать и вывести. Как?
    #40015184
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Н-да, второй раз встретил девушку умнее и значительно "погоромистов". ;)
поржал..
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сгруппировать и вывести. Как?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]