Имя: Пароль:
1C
1C 7.7
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
(30)  :) нет
вот что тогда получим:
https://prnt.sc/18ow0b3
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
И.. лучше писать универсально, а то перейдет на скуль, к примеру и всё, запрос не рабочий