|
|
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть числа: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Надо выбрать все строки у которых первые цифры уникальны. Например первые 6 это будет: Код: sql 1. 2. 3. 4. Как сделать такой запрос и чтобы он стоил как можно меньше? У меня есть несколько идей: 1. Хранить все в строках, тогда через LIKE, но не знаю будет ли работать такая конструкция с DISTINCT. И тут еще вопрос про индексацию.. Такие числовые значения прекрасно идексируются, а строки врятли будут также хороши индексироваться, хотя я не привязан к числам, мне главное чтобы каждый символ в этом большим числе был одним из четырех, сейчас это 1,2,3 или 4. 2. Делать предварительное разделение столбца (при запросе) и дальше по разделенной части делать DISTINCT. Тут я не знаю как делать такое разделение... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2015, 11:55 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
ClosiusНадо выбрать все строки у которых первые цифры уникальны .противоречие. все или только уникальные? ClosiusКак сделать такой запрос и чтобы он стоил как можно меньше?Сделать несколько запросов и выбрать с минимальной стоимостью. ClosiusИ тут еще вопрос про индексациюиндексация перебору всех записей не помощник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2015, 12:00 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
UPD ко второму пункту: Не знаю как сделать это с меньшей стоимостью.. Просто делить все поля (WHERE a / 100000 и отбрасывать дробную часть) мне кажется достаточно затратно... Может есть способ лучше, по маске какой нибудь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2015, 12:06 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
p2.ClosiusНадо выбрать все строки у которых первые цифры уникальны .противоречие. все или только уникальные? Уникальные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2015, 12:08 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
ClosiusUPD ко второму пункту: Не знаю как сделать это с меньшей стоимостью.. Просто делить все поля (WHERE a / 100000 и отбрасывать дробную часть) мне кажется достаточно затратно... Может есть способ лучше, по маске какой нибудь... trunc(a, -N), где N - число отбрасываемых справа знаков в числе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2015, 12:09 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
Щукина АннаClosiusUPD ко второму пункту: Не знаю как сделать это с меньшей стоимостью.. Просто делить все поля (WHERE a / 100000 и отбрасывать дробную часть) мне кажется достаточно затратно... Может есть способ лучше, по маске какой нибудь... trunc(a, -N), где N - число отбрасываемых справа знаков в числе Я вот так попробовал: Код: sql 1. 2. Нормальный ли это путь? Ну мне round подходит тоже, так как числа не больше 4 после запятой, то есть округление в меньшую сторону. Хотя думаю trunc быстрее будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2015, 12:34 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
Closius, осторожно интересуюсь -- тип исходных чисел у вас какой ? bigint OR numeric если из интов -- то там целочисленное деление определено. если numeric -- вместо round надо бы fix -- т.е. или ceil(numeric/numeic) либо trunc(numeric/numeic) -- в зависимости от желаемого поведения для отрицательных. ну и , если префиксов мало и они часто повторяются -- для фиксированного основания возможен был бы функциональный индекс, и соответствующая техника получения дистинкта по частым повторениям, описанная где--то тут максимом. для плавающего основания -- судя по всему тоже -- но только как LIKE и индекса по тексту с varchar_pattern_ops, с лидирующими 0--ми в тексте -- для приведения остатков к фиксированной длине строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2015, 12:51 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
qwwqClosius, осторожно интересуюсь -- тип исходных чисел у вас какой ? bigint OR numeric если из интов -- то там целочисленное деление определено. если numeric -- вместо round надо бы fix -- т.е. или ceil(numeric/numeic) либо trunc(numeric/numeic) -- в зависимости от желаемого поведения для отрицательных. ну и , если префиксов мало и они часто повторяются -- для фиксированного основания возможен был бы функциональный индекс, и соответствующая техника получения дистинкта по частым повторениям, описанная где--то тут максимом. для плавающего основания -- судя по всему тоже -- но только как LIKE и индекса по тексту с varchar_pattern_ops, с лидирующими 0--ми в тексте -- для приведения остатков к фиксированной длине строки. Спасибо. У меня numeric, причем гарантированно положительные. Вот так думаю оптимальнее всего. Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2015, 15:06 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
ClosiusUPD ко второму пункту: Не знаю как сделать это с меньшей стоимостью.. Просто делить все поля (WHERE a / 100000 и отбрасывать дробную часть) мне кажется достаточно затратно... Может есть способ лучше, по маске какой нибудь... что затратно? это бд на телефоне чтоли? ты реально думаешь, что в цпу упрешся?????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 01:33 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
Ivan DurakClosiusUPD ко второму пункту: Не знаю как сделать это с меньшей стоимостью.. Просто делить все поля (WHERE a / 100000 и отбрасывать дробную часть) мне кажется достаточно затратно... Может есть способ лучше, по маске какой нибудь... что затратно? это бд на телефоне чтоли? ты реально думаешь, что в цпу упрешся?????? Такой запрос будет приходить от клиента очень часто. Например от одного клиента раз в 10 секунд, штук 20-30 таких запросов. Клиентов несколько миллионов. Данных миллионов 10. Это планируется, по факту может быть хуже. Да, все норм, не упрусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 11:01 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
ClosiusТакой запрос будет приходить от клиента очень часто.часто получать из базы список всех уникальных префиксов? а как часто этот список меняется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 11:40 |
|
||
|
DISTINCT по первой части числа
|
|||
|---|---|---|---|
|
#18+
p2.ClosiusТакой запрос будет приходить от клиента очень часто.часто получать из базы список всех уникальных префиксов? а как часто этот список меняется? Часто меняется. Пользователи могут добавлять или удалять новые объекты когда захотят (в ограниченном кол-ве). Это маркеры на карте. А цифры это код маркера. Карту двигать могут. Каждое движение это новая область запроса (ну на самом деле преусмотрено кширование на клиенте, но всеравно...). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 19:58 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39080196&tid=1997701]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
152ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 271ms |
| total: | 507ms |

| 0 / 0 |
