powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / join?
25 сообщений из 25, страница 1 из 1
join?
    #39255722
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите, пожалуйста. Возможно, это слишком просто, но я не могу придумать.
Упрощенный вариант.
Есть 3 таблицы.

Таблица A
SIDName1Маша2Даша3Настя

Таблица B
SIDPIDPRICE11100122001330021100222003250

Таблица C
PIDDATE12014.06.1422015.06.1532016.06.13

Нужно получить Имя + Прайс. Но если цен несколько - выдавать самую "новую".
Т.е. должно получиться:
NamePriceМаша300Даша200Настя50

Есть идеи, люди добрые?)
...
Рейтинг: 0 / 0
join?
    #39255724
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а свой вариант? (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
join?
    #39255735
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий,

Я думал в сторону:
Код: plsql
1.
SELECT A.SID, A.NAME, B.SPRICE FROM A, B WHERE (A.SID=B.SID) B.PID IN (SELECT PID FROM C WHERE C.FILIAL=1 ORDER BY C.FDATE DESC)"



Но ясно, что он выдает все варианты.

Код: plsql
1.
SELECT A.SID, A.NAME, B.SPRICE FROM A, B WHERE (A.SID=B.SID) B.PID IN (SELECT FIRST 1 PID FROM C WHERE C.FILIAL=1 ORDER BY C.FDATE DESC)"



Этот вариант выдает совсем не то, я даже понял почему....
...
Рейтинг: 0 / 0
join?
    #39255738
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volframЕсть идеи, люди добрые?)
Задача учебная или продакшен?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
join?
    #39255739
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Вообще - что-то среднее. Firebird в глаза вижу раз третий. Поэтому можно считать учебная. Но на реальной задачи, в духе - "помоги подправить у нас тут все горит, тыжпрограммист"...
...
Рейтинг: 0 / 0
join?
    #39255741
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для учебной задачи можно обойтись джоином и first_value(). Для нагруженного продакшена
стоит подумать о хранимых агрегатах.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
join?
    #39255743
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Не, если в этом разрезе, то учебная :-) Им выгрузить надо и забыть.
...
Рейтинг: 0 / 0
join?
    #39255750
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Function unknown\n- FIRST_VALUE'

Не знает такую функцию...
...
Рейтинг: 0 / 0
join?
    #39255753
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volfram
Нужно получить Имя + Прайс. Но если цен несколько - выдавать самую "новую".
Т.е. должно получиться:
NamePriceМаша300Даша200Настя50


БД проституток?

а если серьёзно

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
WITH T AS (
  SELECT
    A.NAME,
    B.PRICE,
    C."DATE",
    MAX(C."DATE") OVER(PARTITION BY B.SID) AS M_DATE
  FROM A 
    JOIN B ON A.SID = B.SID
    JOIN C ON C.PID = B.PID
)
SELECT NAME, PRICE
FROM T
WHERE "DATE" = M_DATE



но вариант не очень-то шустрый
...
Рейтинг: 0 / 0
join?
    #39255757
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Спасибо большое, сейчас проверю.
...
Рейтинг: 0 / 0
join?
    #39255764
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volfram,

ты бы версию сказал. Раз ничего не сказал, то по умолчанию я считаю что Firebird 3.0.
На 2.5 это работать не будет.
...
Рейтинг: 0 / 0
join?
    #39255773
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, как-то так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT A.NAME, B.PRICE
  FROM B
    INNER JOIN A ON A.SID = B.SID
    INNER JOIN C ON C.PID = B.PID
    INNER JOIN (
          SELECT B.SID, Max(C.DATE) AS DATE
            FROM B
              INNER JOIN C ON C.PID = B.PID
            GROUP BY B.SID
        ) D
      ON D.SID = B.SID AND D.DATE = C.DATE
...
Рейтинг: 0 / 0
join?
    #39255781
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Блин, моя вина)
Прошу прощения.
Да, версия 2.5... И он ругается на PARTITION
...
Рейтинг: 0 / 0
join?
    #39255783
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volfram,

вариант rdb_dev должен работать.
А вообще очень странно почему даты хранятся отдельно от прайса.
...
Рейтинг: 0 / 0
join?
    #39255814
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_dev,

Спасибо за то, что не прошли мимо!
Я проверил, но он выдает всё, что есть в базе. Но уже упорядочено.
Т.е. что-то типо:

NamePriceМаша300Маша200Маша100Даша200Даша100Настя50
...
Рейтинг: 0 / 0
join?
    #39255815
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И да, если я правильно понял, то фильтр (какой филиал использовать, как у меня в примере) надо добавлять в формировании таблицы D?
...
Рейтинг: 0 / 0
join?
    #39255817
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Там вообще все странно хранится....Я несколько часов убил на то, чтобы понять логику :-)
...
Рейтинг: 0 / 0
join?
    #39255825
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volfram, чтобы понять логику, надо, всего лишь, не "плавать" в реляционных СУБД (RDBMS - Relational Database Management System). Для начала, посмотри перевод слова "relation", а потом залезь на вики https://ru.wikipedia.org/wiki/Нормальная_форма
...
Рейтинг: 0 / 0
join?
    #39255833
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так будет работать и даже без C, но только если в B самые большие PID соответствуют самым свежим ценам

Код: sql
1.
2.
3.
4.
select a.name, b1.price from
B b1 left join B b2 on b1.SID=b2.SID and b2.PID>b1.PID
join a on a.sid=b1.sid
where b2.SID is null
...
Рейтинг: 0 / 0
join?
    #39255880
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devКажется, как-то так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT A.NAME, B.PRICE
  FROM B
    INNER JOIN A ON A.SID = B.SID
    INNER JOIN C ON C.PID = B.PID
    INNER JOIN (
          SELECT B.SID, Max(C.DATE) AS DATE
            FROM B
              INNER JOIN C ON C.PID = B.PID
            GROUP BY B.SID
        ) D
      ON D.SID = B.SID AND D.DATE = C.DATE



Это точно не работает.
Все дело в том, что таблица D получается без уникального ключа PID. Если бы туда добавить PID и джоинить по нему, наверное, получится. Как это сделать - не знаю. Если добавляю, как обычно - в GRUP BY дописываю B.PID и в SELECT его добваляю, то ошибка
not contained in either an aggregate function or the GROUP BY clause
...
Рейтинг: 0 / 0
join?
    #39255882
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stelvic,

Запрос вообще завис, пока не разбирался почему.
Просто без даты, как-то страшно так вслепую использовать.
...
Рейтинг: 0 / 0
join?
    #39255898
rstrelba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
select
A.Name,
(select first 1 B.Price from B,C 
where 
B.SID=A.SID and B.PID=C.PID order by C.DATE DESC) as Price
from A
...
Рейтинг: 0 / 0
join?
    #39255912
volfram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rstrelba
Код: sql
1.
2.
3.
4.
5.
6.
select
A.Name,
(select first 1 B.Price from B,C 
where 
B.SID=A.SID and B.PID=C.PID order by C.DATE DESC) as Price
from A



Я так и думал, что это не так сложно!
Спасибо большое :-)
Все работает!
...
Рейтинг: 0 / 0
join?
    #39256076
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volframstelvic,

Запрос вообще завис, пока не разбирался почему.
Просто без даты, как-то страшно так вслепую использовать.

Ну, видимо потому, что таблицы другие. Или они огромные и без индексов. На том примере таблиц, что ты привел это работает.
...
Рейтинг: 0 / 0
join?
    #39256125
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volframЭто точно не работает.Пробовал?

volframВсе дело в том, что таблица D получается без уникального ключа PID.Вместо PID таблица D содержит записи с уникальными значениями идентификатора пользователя и датой последней цены для этого идентификатора, что является эквивалентом PID. Приоритет формы над содержанием.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / join?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]