|
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
|
И.. лучше писать универсально, а то перейдет на скуль, к примеру и всё, запрос не рабочий
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |