Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сгруппировать и вывести. Как? / 23 сообщений из 23, страница 1 из 1
01.11.2020, 13:40
    #40013925
kompospec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгруппировать и вывести. Как?
Есть огромная таблица из 3 полей

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

Вот так умею:

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

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

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

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

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

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


А кода нельзя привести? Спасибо.
...
Рейтинг: 0 / 0
01.11.2020, 14:59
    #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
01.11.2020, 15:11
    #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
01.11.2020, 15:51
    #40013965
kompospec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгруппировать и вывести. Как?
Щукина Анна,

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

Работает!!!
Спасибо огромнейшее.
Первый раз вижу девушку умнее меня.
Спасибо.
...
Рейтинг: 0 / 0
01.11.2020, 20:10
    #40014031
kompospec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгруппировать и вывести. Как?
Рано я радовался. На локальной, небольшой базе работает, а на сервере - тормознутые-тормоза. Уже 15 мин считает.
...
Рейтинг: 0 / 0
01.11.2020, 21:57
    #40014046
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгруппировать и вывести. Как?
kompospec
а на сервере - тормознутые-тормоза. Уже 15 мин считает.
А создать индекс u(u1) ?
...
Рейтинг: 0 / 0
02.11.2020, 03:41
    #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
02.11.2020, 03:45
    #40014089
kompospec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгруппировать и вывести. Как?
Akina,

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

Если кто расскажет - то спасиб, большое.
...
Рейтинг: 0 / 0
02.11.2020, 07:40
    #40014103
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгруппировать и вывести. Как?
Так поле u1 ещё и текстовое? ну-ну... DDL полный показывайте.
...
Рейтинг: 0 / 0
02.11.2020, 12:25
    #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
02.11.2020, 12:36
    #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
02.11.2020, 15:34
    #40014383
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сгруппировать и вывести. Как?
u1 определено как tinytext

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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