|   |   | 
| 
 | v7: Синтаксис SQL запроса. Функция First | ☑ | ||
|---|---|---|---|---|
| 0
    
        evgpinsk_ 04.07.21✎ 23:07 | 
        текст SQL запроса:
 SELECT Товары.Код, First(Товары.Цена) FROM Товары GROUP BY Товары.Код; но 1sqlite ругается на функцию First: "no such function: First" Есть ли в синтаксисе 1sqlite данная функция? | |||
| 1
    
        серый КТУЛХУ 05.07.21✎ 00:33 | 
        https://stackoverflow.com/questions/47623309/first-and-last-function-in-sqlite
 (думаю к 1sqlite тоже относится) | |||
| 2
    
        evgpinsk_ 05.07.21✎ 00:46 | 
        (1) Т.е. вместо функции First предлагаете использовать подзапрос?     | |||
| 3
    
        Salimbek 05.07.21✎ 01:07 | 
        (0) Ваш запрос, в переводе на человеческий, звучит так:
 "Выбери мне поле Код и Первое(Цена) из таблицы Товары сгруппированное по Код". Откуда вопрос - а это самое Первое - вы хотите по Алфавиту? Или по Дате (а она в запросе есть?)??? Или еще по какой сортировке? Вот и СКЛ тоже не понимает, чего вы от него хотите. А для получения последнего значения в 1SQLite надо сначала понять, как лежат данные в таблицах. Начните с этого: http://www.script-coding.com/v77tables.html#2.5.5. | |||
| 4
    
        evgpinsk_ 05.07.21✎ 01:17 | 
        (3) Вот пример того что я хочу:
 https://intellipaat.com/community/3393/select-first-row-in-each-group-by-group функция First - работает. В том числе и в MSAccess Используя её я решаю свою задачу. Но вот 1SQLite на неё ругается ( | |||
| 5
    
        evgpinsk_ 05.07.21✎ 01:23 | 
        (3) > "Откуда вопрос - а это самое Первое - вы хотите по Алфавиту? Или по Дате (а она в запросе есть?)??? Или еще по какой сортировке?"
 Записи в любой таблице расположены в определённом порядке. И соответственно всегда можно найти первую запись. Если применить сортировку (по Алфавиту или по дате) тогда First и будет выдавать разные результаты | |||
| 6
    
        Sserj 05.07.21✎ 01:56 | 
        (4) "В том числе и в MSAccess" - правильно "Только в MSAccess". Нет такой функции в стандарте SQL.     | |||
| 7
    
        Ёпрст гуру 05.07.21✎ 09:22 | 
        И..в дбф тоже, нет понятия первой записи..     | |||
| 8
    
        Ёпрст гуру 05.07.21✎ 09:23 | 
        Тебе надо селект вася фром табличка ордер бай лимит 1     | |||
| 9
    
        Ёпрст гуру 05.07.21✎ 09:23 | 
        И если 1скулайт, то видать дбф?))     | |||
| 10
    
        Ёпрст гуру 05.07.21✎ 09:25 | 
        Там, см (7). Любая запись может стать "первой", если эту запись пометят маркером удаления. Ибо в начале, перезаписываются записи помеченные маркером на удаление и только потом, новые в конец файла     | |||
| 11
    
        Василий Алибабаевич 05.07.21✎ 09:48 | 
        (7) А как же GOTO RECORD 1? Оно сходит именно на первую запись.
 (10) APPEND BLANK всегда добавит новую запись. Переписать с маркером DELETED - забота прикладного программиста. | |||
| 12
    
        Ёпрст гуру 05.07.21✎ 10:05 | 
        (11) 1с-ина поступает именно так, например.     | |||
| 13
    
        evgpinsk_ 05.07.21✎ 10:17 | 
        (7) Не могу понять, ну как же нет? 
 Вот пример таблицы: Товар Магазин Цена Нужно найти на все товары минимальные цены и их магазины. И вот очень простое решение: SELECT Товар, First(Магазин), Min(Цена) FROM Цены GROUP BY [Цены].Товар; | |||
| 14
    
        evgpinsk_ 05.07.21✎ 10:18 | 
        (8) да, про Limit 1 думал, но чтото тоже не проходил синтаксис :)
 в запросе в котором GROUP BY используется | |||
| 15
    
        evgpinsk_ 05.07.21✎ 10:19 | 
        (10) Речь ведь о запросе (а не о таблице), который получает какойто результат, и в котором можно использовать функцию First     | |||
| 16
    
        Ёпрст гуру 05.07.21✎ 10:19 | 
        (14) нам отсюда не виден твой запрос и нужен ордер бай, а не группировка     | |||
| 17
    
        youalex 05.07.21✎ 10:20 | 
        в tsql есть оконная функция FIRST_VALUE(), насколько это применимо здесь и есть ли подобно в склайте - сказать затрудняюсь     | |||
| 18
    
        evgpinsk_ 05.07.21✎ 10:25 | 
        (16) Через MsAccess:
 https://prnt.sc/18otws1 и почему ордер бай? ордер бай - это ведь прото сортировка | |||
| 19
    
        evgpinsk_ 05.07.21✎ 10:26 | 
        (17) пробовал её - тоже не прошла     | |||
| 20
    
        Ёпрст гуру 05.07.21✎ 10:26 | 
        (18) тебе этот запрос где нужен в аксессе ?     | |||
| 21
    
        Ёпрст гуру 05.07.21✎ 10:26 | 
        или в 1с ?     | |||
| 22
    
        evgpinsk_ 05.07.21✎ 10:29 | 
        (21) в 1с dbf /в ней ссылка на базу db3/ в которой куча цен на товары с онлайн площадки. 
 и задача - найти минимальные цены на товары п.с. просто использую Access для быстрого построения запросов | |||
| 23
    
        Ёпрст гуру 05.07.21✎ 10:30 | 
        (22) И нахрена там first ?     | |||
| 24
    
        Ёпрст гуру 05.07.21✎ 10:30 | 
        когда нужен min &     | |||
| 25
    
        Ёпрст гуру 05.07.21✎ 10:30 | 
        ?     | |||
| 26
    
        evgpinsk_ 05.07.21✎ 10:31 | 
        Хотя эту же базе db3 через ODBC подключил и в MsAccess и там я нужны результат вижу, но хотелось бы и в 1c реализовать этот запрос )
 А т.к. гугл толком не даёт синтаксис SQL для 1sqLite - вот и затык на этой функции First случился п.с. странно почему она её не поддерживает, вроде полезная | |||
| 27
    
        Ёпрст гуру 05.07.21✎ 10:31 | 
        (26) она бестолковая     | |||
| 28
    
        Ёпрст гуру 05.07.21✎ 10:32 | 
        даже вредная     | |||
| 29
    
        evgpinsk_ 05.07.21✎ 10:32 | 
        (24) мин - для получения минимальной цены Товара (и используется для поля Цена)
 а параллельно нужно получить ещё инфу - в каком магазине эта цена | |||
| 30
    
        Ёпрст гуру 05.07.21✎ 10:32 | 
        SELECT Товар, Магазин, Min(Цена)
 FROM Цены GROUP BY Товар,Магазин; | |||
| 31
    
        evgpinsk_ 05.07.21✎ 10:34 | ||||
| 32
    
        evgpinsk_ 05.07.21✎ 10:35 | 
        Получим на каждый товар цены во всех магазинах
 А мне нужно на каждый товар найти единственный магазин, в котором минимальная цена | |||
| 33
    
        Ёпрст гуру 05.07.21✎ 10:36 | 
        (32) ? схрена ли ?     | |||
| 34
    
        Ёпрст гуру 05.07.21✎ 10:36 | 
        Ты свой акцесс выкинь на помойку и не открывацй его больше     | |||
| 35
    
        evgpinsk_ 05.07.21✎ 10:40 | 
        (34)  ))). Визуально строить сложные запросы - намного быстрее по времени. 
 (33) Ёпрст, я знаю твой высокий уровень, но мне кажется сейчас ты немного запутался /хотя в это и трудно поверить/ | |||
| 36
    
        NorthWind 05.07.21✎ 10:40 | 
        Access выкидывать не надо, он для некоторых применений неплох. Но нужно иметь в виду, что его синтаксис, в том числе за счет VBA, гораздо шире чем позволяют многие другие настольные базы и даже SQL-серверы.     | |||
| 37
    
        evgpinsk_ 05.07.21✎ 10:42 | 
        (36) И пример функции First тому подтверждение 
 очень ведь красивое и простое решение задачи через неё: (18) | |||
| 38
    
        NorthWind 05.07.21✎ 10:48 | 
        Кстати, кто мне скажет, SELECT TOP стандартная конструкция или это чисто MSовское расширение SQL?
 По-моему, это нестандарт, в частности, в MySQL подобная задача решается через слово LIMIT. | |||
| 39
    
        Chai Nic 05.07.21✎ 10:50 | 
        (38) ..А в fb/ib через слово rows.
 В общем, возможность ограничивать количество записей - нестандарт, каждый придумывает по своему. | |||
| 40
    
        Йохохо 05.07.21✎ 10:52 | 
        (37) за всё "красивое" ты заплатишь ужасным по оптимизации движком аксес. давно бы переписал, чем биться об стену     | |||
| 41
    
        acht 05.07.21✎ 10:52 | 
        (38) Майкрософтоское. По стандарту там в ANSI 2008 типа "FETCH FIRST"     | |||
| 42
    
        acht 05.07.21✎ 10:54 | 
        (37) > очень ведь красивое
 Тебе задачу решить, или губки накрасить? | |||
| 43
    
        evgpinsk_ 05.07.21✎ 10:56 | 
        (42) Задачу решить, и желательно за минимальное время )
 В акссессе сделал это за пару минут, а 1sqlite убил на это уже наверное целый час. И кроме чуток повышения скила пока больше ничего ) | |||
| 44
    
        evgpinsk_ 05.07.21✎ 10:57 | 
        (40) Пока не замечал нюансов. Часто параллельно пишу запросы сначала там, потом в 1с - по скорости одинаково работают     | |||
| 45
    
        Ёпрст гуру 05.07.21✎ 11:02 | 
        Результат запроса в (30) покажи не в твоем аксессе, а в запросе скульлайт     | |||
| 46
    
        Ёпрст гуру 05.07.21✎ 11:02 | 
        (43) ответ в (30)     | |||
| 47
    
        evgpinsk_ 05.07.21✎ 11:03 | 
        (45) Много движений для этого нужно сделать (
 Но неужели он будет другой ? Вроде ведь тут и так всё видно. Для решения моей задачи нужно использовать Limit | |||
| 48
    
        evgpinsk_ 05.07.21✎ 11:04 | 
        (46) Блин, както не верится. Ладно, сейчас буду проверять в 1с     | |||
| 49
    
        Ёпрст гуру 05.07.21✎ 11:05 | 
        (47) для нахождения мин цены по уникальным парам товар магазин - нет     | |||
| 50
    
        Ёпрст гуру 05.07.21✎ 11:08 | 
        Если тебе для каждого товара нужен только ОДин магазин, то запрос да, нужно переписать     | |||
| 51
    
        evgpinsk_ 05.07.21✎ 11:10 | 
        (50) Именно, я ведь писал выше про это.
 Задача - найти для каждого товару Одну минимальную цену, и в каком магазине эта цена | |||
| 52
    
        evgpinsk_ 05.07.21✎ 11:10 | 
        (49) )) Просто ещё не проснулся и прочитал между строк )     | |||
| 53
    
        Ёпрст гуру 05.07.21✎ 11:20 | 
        Селект т1.товар, т1.цена, мин(т2.магазин) фром
 (Селект товар,мин(цена) фром табличка гроуп ай товар) ас т1 Лефт джоин табличка ас т2 он т2.товар = т1.товар энд т2.цена = т1.цена Гроуп бай т1.цена,т1.товар | |||
| 54
    
        Ёпрст гуру 05.07.21✎ 11:24 | 
        Можно еще через коррелированный подзапрос в селект листе сделать     | |||
| 55
    
        Злопчинский 05.07.21✎ 11:26 | 
        а что будет при мин(т2.магазин)..? мин от числа я понимаю еще, мин от строки я тоже вроде ок. а мин от магазина? или магазин сздесь как строка рассматривается?     | |||
| 56
    
        Ёпрст гуру 05.07.21✎ 11:30 | 
        (55) если это ссылка, то мин ссылки     | |||
| 57
    
        Ёпрст гуру 05.07.21✎ 11:31 | 
        Это если у него мин цена одинаковая на один товар и несколько магазов     | |||
| 58
    
        Djelf 05.07.21✎ 11:35 | 
        (0) На самом деле есть, начиная с 3.25.0 https://www.sqlite.org/windowfunctions.html
 Пример https://www.sqlitetutorial.net/sqlite-window-functions/sqlite-first_value/ Но с этими оконными функциями придется мозг поломать. | |||
| 59
    
        evgpinsk_ 05.07.21✎ 11:45 | 
        (58) Видел эту инфу и пробовал. Но ругается так:
 misuse of window function FIRST_VALUE() п.с. Больше был теоретический интерес чем большая практическая необходимость. Пока через ODBC подключил db3 базу в Акссесс и через простой запрос смотрю нужную инфу (53) тут конечно нужно больше чем пару минут для начинающего мозг поломать ) | |||
| 60
    
        evgpinsk_ 05.07.21✎ 11:47 | 
        (58) У меня версия 3.35     | |||
| 61
    
        Злопчинский 05.07.21✎ 11:49 | 
        (56) а что такое "минимум ссылки"? минимум строковых значений (ссылка=строка)?     | |||
| 62
    
        Djelf 05.07.21✎ 12:01 | 
        (60) Значит такая функция есть, а misuse of window function означает что ты ее неверно используешь.     | |||
| 63
    
        evgpinsk_ 05.07.21✎ 12:01 | 
        (53) Перепроверил через MsAccess, да - работает классический синтаксис:
 SELECT Цены.Товар, Цены.Магазин, t1.[Min-Цена] FROM Цены INNER JOIN t1 ON (Цены.Цена = t1.[Min-Цена]) AND (Цены.Товар = t1.Товар) GROUP BY Цены.Товар, Цены.Магазин, t1.[Min-Цена]; но согласитесь, слева и проще и красивей https://prnt.sc/18pecmn | |||
| 64
    
        evgpinsk_ 05.07.21✎ 12:02 | 
        (62) Да, переводчиком воспользовался ).
 Но лишь только один текст "оконная функция" отбил желание лезть в дебри ) | |||
| 65
    
        Ёпрст гуру 05.07.21✎ 12:04 | 
        (61) да     | |||
| 66
    
        hhhh 05.07.21✎ 12:07 | 
        (63) но в нем совсем не факт, что в первом магазине будет минимальная цена. Может он первый, но в нем другая цена.     | |||
| 67
    
        evgpinsk_ 05.07.21✎ 12:10 | 
        Конечно мне не важно получить ПЕРВУЮ строку. Повторю задачу: "нужно для всех товаров получить единственную минимульную цену и магазин с этой ценой (или любой первый магазин, если таких магазинов несколько) 
 Насколько я вижу, и (63) и (18) решает эту задачу | |||
| 68
    
        evgpinsk_ 05.07.21✎ 12:12 | 
        Вот результат по данным:
 https://prnt.sc/18pgocz | |||
| 69
    
        evgpinsk_ 05.07.21✎ 12:37 | 
        Попутно задам уже здесь вопрос, чтобы новую тему не подымать. По представлению VIEW 
 (через него можно сохранять болванку запроса и далее его использовать в других запросах) Мне не до конца понятен принцип действия вот пример использования: Текстзапрос="DROP VIEW IF EXISTS МинЦеныВсемагаз"; тз=запрос.ВыполнитьЗапрос(Текстзапрос); Представление = "CREATE VIEW temp.МинЦеныВсемагаз AS SELECT Прайс.Товар, Товары.СуперКлюч, Count(Прайс.Магазин) AS КоличМагаз, Прайс.Цена AS Цена |FROM Прайс INNER JOIN Товары ON Прайс.Товар = Товары.Код |GROUP BY Прайс.Товар, Товары.СуперКлюч, Прайс.Цена;"; Запрос.ВыполнитьЗапрос(Представление); Зачем нужно перед созданием VIEW его удалять? Я вижу что без DROP ругается при запуске кода второй и последующие разы, но не понимаю почему. И второй вопрос - с производительностью здесь ведь всё ок? Ведь конструкция "CREATE VIEW" не тратит время, а время уходит только на конечный запрос Select, верно? | |||
| 70
    
        Djelf 05.07.21✎ 12:45 | 
        (69) Можно и не удалять. Но тогда нужно писать так: CREATE VIEW IF NOT EXISTS чтобы не ругалось.
 Но тогда VIEW не не обновится, а на этапе отладки это неудобно. | |||
| 71
    
        Sserj 05.07.21✎ 12:53 | 
        (13) Открою страшную тайну. В SQLite тебе не нужна функция.
 Можешь написать SELECT Товар, , Min(Цена), Магазин FROM Цены GROUP BY [Цены].Товар; И магазин будет из той строки откуда взята min(Цена) | |||
| 72
    
        Sserj 05.07.21✎ 13:07 | 
        +(71) Запятая лишняя:
 SELECT Товар, Min(Цена), Магазин FROM Цены GROUP BY Товар | |||
| 73
    
        evgpinsk_ 05.07.21✎ 13:51 | 
        (71) В Ассесс такой синтаксис не работает чтобы быстро проверить.
 Гляну попозже в 1с | |||
| 74
    
        Ёпрст гуру 05.07.21✎ 13:53 | 
        (71) это обещали пофиксить иещ с времен первых версий..на форуме скульлайта была ветка, оставлять или нет, видать оставили.
 В других языках, сразу будет ошибка синтаксиса. Вообще. в скульлайте всё немного по-другому. | |||
| 75
    
        Ёпрст гуру 05.07.21✎ 13:54 | 
        И.. лучше писать универсально, а то перейдет на скуль, к примеру и всё, запрос не рабочий     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |