Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Синтаксис SQL запроса. Функция First

v7: Синтаксис SQL запроса. Функция First
Я
   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 тоже относится)
   evgpinsk_
 
2 - 05.07.21 - 00:46
(1) Т.е. вместо функции First предлагаете использовать подзапрос?
   Salimbek
 
3 - 05.07.21 - 01:07
(0) Ваш запрос, в переводе на человеческий, звучит так:
"Выбери мне поле Код и Первое(Цена) из таблицы Товары сгруппированное по Код".

Откуда вопрос - а это самое Первое - вы хотите по Алфавиту? Или по Дате (а она в запросе есть?)??? Или еще по какой сортировке?

Вот и СКЛ тоже не понимает, чего вы от него хотите.

А для получения последнего значения в 1SQLite надо сначала понять, как лежат данные в таблицах. Начните с этого: http://www.script-coding.com/v77tables.html#2.5.5.
   evgpinsk_
 
4 - 05.07.21 - 01:17
(3) Вот пример того что я хочу:
https://intellipaat.com/community/3393/select-first-row-in-each-group-by-group
функция First - работает. В том числе и в MSAccess
Используя её я решаю свою задачу. Но вот 1SQLite на неё ругается (
   evgpinsk_
 
5 - 05.07.21 - 01:23
(3) > "Откуда вопрос - а это самое Первое - вы хотите по Алфавиту? Или по Дате (а она в запросе есть?)??? Или еще по какой сортировке?"

Записи в любой таблице расположены в определённом порядке. И соответственно всегда можно найти первую запись.
Если применить сортировку (по Алфавиту или по дате) тогда First и будет выдавать разные результаты
   Sserj
 
6 - 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с-ина поступает именно так, например.
   evgpinsk_
 
13 - 05.07.21 - 10:17
(7) Не могу понять, ну как же нет?
Вот пример таблицы:
Товар
Магазин
Цена

Нужно найти на все товары минимальные цены и их магазины. И вот очень простое решение:
SELECT Товар, First(Магазин), Min(Цена)
FROM Цены
GROUP BY [Цены].Товар;
   evgpinsk_
 
14 - 05.07.21 - 10:18
(8) да, про Limit 1 думал, но чтото тоже не проходил синтаксис :)
в запросе в котором GROUP BY используется
   evgpinsk_
 
15 - 05.07.21 - 10:19
(10) Речь ведь о запросе (а не о таблице), который получает какойто результат, и в котором можно использовать функцию First
   Ёпрст
 
16 - 05.07.21 - 10:19
(14) нам отсюда не виден твой запрос и нужен ордер бай, а не группировка
   youalex
 
17 - 05.07.21 - 10:20
в tsql есть оконная функция FIRST_VALUE(), насколько это применимо здесь и есть ли подобно в склайте - сказать затрудняюсь
   evgpinsk_
 
18 - 05.07.21 - 10:25
(16) Через MsAccess:
https://prnt.sc/18otws1
и почему ордер бай?
ордер бай - это ведь прото сортировка
   evgpinsk_
 
19 - 05.07.21 - 10:26
(17) пробовал её - тоже не прошла
   Ёпрст
 
20 - 05.07.21 - 10:26
(18) тебе этот запрос где нужен в аксессе ?
   Ёпрст
 
21 - 05.07.21 - 10:26
или в 1с ?
   evgpinsk_
 
22 - 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
?
   evgpinsk_
 
26 - 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
даже вредная
   evgpinsk_
 
29 - 05.07.21 - 10:32
(24) мин - для получения минимальной цены Товара (и используется для поля Цена)
а параллельно нужно получить ещё инфу - в каком магазине эта цена
   Ёпрст
 
30 - 05.07.21 - 10:32
SELECT Товар, Магазин, Min(Цена)
FROM Цены
GROUP BY Товар,Магазин;
 
 
   evgpinsk_
 
31 - 05.07.21 - 10:34
(30)  :) нет
вот что тогда получим:
https://prnt.sc/18ow0b3
   evgpinsk_
 
32 - 05.07.21 - 10:35
Получим на каждый товар цены во всех магазинах
А мне нужно на каждый товар найти единственный  магазин, в котором минимальная цена
   Ёпрст
 
33 - 05.07.21 - 10:36
(32) ? схрена ли ?
   Ёпрст
 
34 - 05.07.21 - 10:36
Ты свой акцесс выкинь на помойку и не открывацй его больше
   evgpinsk_
 
35 - 05.07.21 - 10:40
(34)  ))). Визуально строить сложные запросы - намного быстрее по времени.
(33) Ёпрст, я знаю твой высокий уровень, но мне кажется сейчас ты немного запутался /хотя в это и трудно поверить/
   NorthWind
 
36 - 05.07.21 - 10:40
Access выкидывать не надо, он для некоторых применений неплох. Но нужно иметь в виду, что его синтаксис, в том числе за счет VBA, гораздо шире чем позволяют многие другие настольные базы и даже SQL-серверы.
   evgpinsk_
 
37 - 05.07.21 - 10:42
(36) И пример функции First тому подтверждение
очень ведь красивое и простое решение задачи через неё: (18)
   NorthWind
 
38 - 05.07.21 - 10:48
Кстати, кто мне скажет, SELECT TOP стандартная конструкция или это чисто MSовское расширение SQL?
По-моему, это нестандарт, в частности, в MySQL подобная задача решается через слово LIMIT.
   Chai Nic
 
39 - 05.07.21 - 10:50
(38) ..А в fb/ib через слово rows.
В общем, возможность ограничивать количество записей - нестандарт, каждый придумывает по своему.
   Йохохо
 
40 - 05.07.21 - 10:52
(37) за всё "красивое" ты заплатишь ужасным по оптимизации движком аксес. давно бы переписал, чем биться об стену
   acht
 
41 - 05.07.21 - 10:52
(38) Майкрософтоское. По стандарту там в ANSI 2008 типа "FETCH FIRST"
   acht
 
42 - 05.07.21 - 10:54
(37) > очень ведь красивое
Тебе задачу решить, или губки накрасить?
   evgpinsk_
 
43 - 05.07.21 - 10:56
(42) Задачу решить, и желательно за минимальное время )
В акссессе сделал это за пару минут, а 1sqlite убил на это уже наверное целый час. И кроме чуток повышения скила пока больше ничего )
   evgpinsk_
 
44 - 05.07.21 - 10:57
(40) Пока не замечал нюансов. Часто параллельно пишу запросы сначала там, потом в 1с - по скорости одинаково работают
   Ёпрст
 
45 - 05.07.21 - 11:02
Результат запроса в (30) покажи не в твоем аксессе, а в запросе скульлайт
   Ёпрст
 
46 - 05.07.21 - 11:02
(43) ответ в (30)
   evgpinsk_
 
47 - 05.07.21 - 11:03
(45) Много движений для этого нужно сделать (
Но неужели он будет другой ?
Вроде ведь тут и так всё видно.
Для решения моей задачи нужно использовать Limit
   evgpinsk_
 
48 - 05.07.21 - 11:04
(46) Блин, както не верится. Ладно, сейчас буду проверять в 1с
   Ёпрст
 
49 - 05.07.21 - 11:05
(47) для нахождения мин цены по уникальным парам товар магазин - нет
   Ёпрст
 
50 - 05.07.21 - 11:08
Если тебе для каждого товара нужен только ОДин магазин, то запрос да, нужно переписать
   evgpinsk_
 
51 - 05.07.21 - 11:10
(50) Именно, я ведь писал выше про это.
Задача - найти для каждого товару Одну минимальную цену, и в каком магазине эта цена
   evgpinsk_
 
52 - 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
Это если у него мин цена одинаковая на один товар и несколько магазов
   Djelf
 
58 - 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/
Но с этими оконными функциями придется мозг поломать.
   evgpinsk_
 
59 - 05.07.21 - 11:45
(58) Видел эту инфу и пробовал. Но ругается так:
misuse of window function FIRST_VALUE()

п.с. Больше был теоретический интерес чем большая практическая необходимость. Пока через ODBC подключил db3 базу в Акссесс и через простой запрос смотрю нужную инфу

(53) тут конечно нужно больше чем пару минут для начинающего мозг поломать )
   evgpinsk_
 
60 - 05.07.21 - 11:47
(58) У меня версия 3.35
 
 
   Злопчинский
 
61 - 05.07.21 - 11:49
(56) а что такое "минимум ссылки"? минимум строковых значений (ссылка=строка)?
   Djelf
 
62 - 05.07.21 - 12:01
(60) Значит такая функция есть, а misuse of window function означает что ты ее неверно используешь.
   evgpinsk_
 
63 - 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
   evgpinsk_
 
64 - 05.07.21 - 12:02
(62) Да, переводчиком воспользовался ).
Но лишь только один текст "оконная функция" отбил желание лезть в дебри )
   Ёпрст
 
65 - 05.07.21 - 12:04
(61) да
   hhhh
 
66 - 05.07.21 - 12:07
(63) но в нем совсем не факт, что в первом магазине будет минимальная цена. Может он первый, но в нем другая цена.
   evgpinsk_
 
67 - 05.07.21 - 12:10
Конечно мне не важно получить ПЕРВУЮ строку. Повторю задачу: "нужно для всех товаров получить единственную минимульную цену и магазин с этой ценой (или любой первый магазин, если таких магазинов несколько)

Насколько я вижу, и (63) и (18) решает эту задачу
   evgpinsk_
 
68 - 05.07.21 - 12:12
Вот результат по данным:
https://prnt.sc/18pgocz
   evgpinsk_
 
69 - 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, верно?
   Djelf
 
70 - 05.07.21 - 12:45
(69) Можно и не удалять. Но тогда нужно писать так: CREATE VIEW IF NOT EXISTS чтобы не ругалось.
Но тогда VIEW не не обновится, а на этапе отладки это неудобно.
   Sserj
 
71 - 05.07.21 - 12:53
(13) Открою страшную тайну. В SQLite тебе не нужна функция.
Можешь написать
SELECT Товар, , Min(Цена), Магазин
FROM Цены
GROUP BY [Цены].Товар;

И магазин будет из той строки откуда взята min(Цена)
   Sserj
 
72 - 05.07.21 - 13:07
+(71) Запятая лишняя:
SELECT Товар, Min(Цена), Магазин
FROM Цены
GROUP BY Товар
   evgpinsk_
 
73 - 05.07.21 - 13:51
(71) В Ассесс такой синтаксис не работает чтобы быстро проверить.
Гляну попозже в 1с
   Ёпрст
 
74 - 05.07.21 - 13:53
(71) это обещали пофиксить иещ с времен первых версий..на форуме скульлайта была ветка, оставлять или нет, видать оставили.
В других языках, сразу будет ошибка синтаксиса.
Вообще. в скульлайте всё немного по-другому.
   Ёпрст
 
75 - 05.07.21 - 13:54
И.. лучше писать универсально, а то перейдет на скуль, к примеру и всё, запрос не рабочий


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.