Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 6
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )

> Как организовать "срез последних/последних"?          
Vofka Подменю пользователя
сообщение 11.10.10, 8:25
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13124
Из: Киев
Спасибо сказали: 3984 раз
Рейтинг: 3115.8

Привет!

Интересует вопрос, как организовать срез последних?

Т.е. есть таблица: id | id_chel (ид человека) | mesto_raboty (место работы) | data (дата). В таблице хранятся люди, место работы и дата. Меняя место работы - мы просто добавляем новую запись, например

1 | Петров | ЧП "У Васи" | 1.10.2010
2 | Иванов | ЧП "У Пети" | 1.10.2010
3 | Петров | ЧП "У Коли" | 5.10.2010
...

Это не связано с 1С. Это просто таблица в какой-нибудь СУБД (MSSQL, MySQL...). Интересует как из такой таблицы получить то, что в 1С называется срезом первых/последних. Интересна сама логика, т.е. указать какое-то условие в запросе или использовать какую-то специальную функцию.


Signature
Пишу программы за деньги

Log1c Подменю пользователя
сообщение 25.01.11, 15:50
Сообщение #2

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 178
Из: Харьков
Спасибо сказали: 26 раз
Рейтинг: 0

Цитата(Vofka @ 11.10.10, 9:25) *
Привет!

Интересует вопрос, как организовать срез последних?

Т.е. есть таблица: id | id_chel (ид человека) | mesto_raboty (место работы) | data (дата). В таблице хранятся люди, место работы и дата. Меняя место работы - мы просто добавляем новую запись, например

1 | Петров | ЧП "У Васи" | 1.10.2010
2 | Иванов | ЧП "У Пети" | 1.10.2010
3 | Петров | ЧП "У Коли" | 5.10.2010
...

Это не связано с 1С. Это просто таблица в какой-нибудь СУБД (MSSQL, MySQL...). Интересует как из такой таблицы получить то, что в 1С называется срезом первых/последних. Интересна сама логика, т.е. указать какое-то условие в запросе или использовать какую-то специальную функцию.


С понятием среза данных не знаком. Сформулируйте пожалуйста что нужно получить в результирующей выборке?


Signature
1С:Предприятие 7.7 БУ + ТиС + ЗП и кадры 7.70.031 для Украины
1С:Предприятие 8.3 УТП для Украины 1.2.28.1 (обычные формы)

Flexy Подменю пользователя
сообщение 25.01.11, 16:12
Сообщение #3

Танцор с Бубном
Иконка группы
Группа: Местный
Сообщений: 1121
Из: Днепра
Спасибо сказали: 220 раз
Рейтинг: 0

SELECT Max(data), id, id_chel, mesto_raboty
from Ваша База
WHERE id='код'
group by id()

Спасибо сказали: Vofka,

Vofka Подменю пользователя
сообщение 26.01.11, 9:20
Сообщение #4

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13124
Из: Киев
Спасибо сказали: 3984 раз
Рейтинг: 3115.8

Цитата
С понятием среза данных не знаком. Сформулируйте пожалуйста что нужно получить в результирующей выборке?

Нужно получить последние (по дате добавления) записи.

Цитата
SELECT Max(data), id, id_chel, mesto_raboty
from Ваша База
WHERE id='код'
group by id()

Допустим можно smile.gif . Ещё варианты есть? smile.gif


Signature
Пишу программы за деньги

World1С Подменю пользователя
сообщение 26.01.11, 9:36
Сообщение #5

Оратор
Иконка группы
Квалифицированному 1С программисту
Группа: Местный
Сообщений: 358
Из: г.Луганск, обл.Луганская
Спасибо сказали: 110 раз
Рейтинг: 0

Select * 
from base as b1
where Date in (Select MAX(Date) from base as b2 where b1.id=b2.id)


Ну вот как то так можно попробовать... Но текст не претендует на звание лучшего.

Select Max(Date), id 
from base
group by id (ну и все остальные поля которые будут в селекте после id)


Signature
В наше время люди всему знают цену, но понятия не имеют о подлинной ценности.
Оскар Уайлд

Спасибо сказали: Vofka,

РомаZ Подменю пользователя
сообщение 09.06.11, 13:35
Сообщение #6

Молчаливый
*
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 0 раз
Рейтинг: 0

Примерно так:

// Входные параметры: 
//           @someDate: DATETIME

SELECT
    srcTable.id
    ,srcTable.Name
    ,srcTable.someOtherProperty
    ,srcTable.Date AS [Дата последнего изменения]
    ,@someDate AS [Дата среза]
    
FROM
    dbTable AS srcTable    // отсюда получаем информацию по id-ам из constraintaTable
    
    INNER JOIN
    (    // Получение последних идентификаторов на дату с дополнительными условиями
        SELECT
            dbTable.id,
            max(dbTable.data)
        FROM dbTable
        WHERE dbTable.data < @someDate
            AND дополнительные условия на отбор по данным таблицы
    ) AS constraintTable
    
    ON srcTable.id = constraintTable.id
    AND srcTable.data = constraintTable.data


Цитата(РомаZ @ 09.06.11, 13:24) *


забыл "Group By".

Вот код с исправлением:

// Входные параметры: 
//           @someDate: DATETIME

SELECT
    srcTable.id
    ,srcTable.Name
    ,srcTable.someOtherProperty
    ,srcTable.Date AS [Дата последнего изменения]
    ,@someDate AS [Дата среза]
    
FROM
    dbTable AS srcTable    // отсюда получаем информацию по id-ам из constraintaTable
    
    INNER JOIN
    (    // Получение последних идентификаторов на дату с дополнительными условиями
        SELECT
            dbTable.id,
            max(dbTable.data)
        FROM dbTable
        WHERE dbTable.data < @someDate
        //    AND дополнительные условия на отбор по данным таблицы
        
        [b]GROUP BY dbTable.id[/b]
        
    ) AS constraintTable
    
    ON srcTable.id = constraintTable.id
    AND srcTable.data = constraintTable.data

Pepe Подменю пользователя
сообщение 09.06.11, 14:55
Сообщение #7

Почти крутой
Иконка группы
Группа: Местный
Сообщений: 1394
Из: Ужгород
Спасибо сказали: 746 раз
Рейтинг: 216.7

Можно построить индекс и отбор по полю дата, можно без индекса найти последнюю запись и идти назад по условию. При работе с ДБФ легко в Visual Foxpro, да и в 1С реализуется, если я правильно понял задание.

szhukov Подменю пользователя
сообщение 07.09.11, 14:27
Сообщение #8

Молчаливый
*
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(РомаZ @ 09.06.11, 14:35) *
Примерно так:

// Входные параметры: 
//           @someDate: DATETIME

SELECT
    srcTable.id
    ,srcTable.Name
    ,srcTable.someOtherProperty
    ,srcTable.Date AS [Дата последнего изменения]
    ,@someDate AS [Дата среза]
    
FROM
    dbTable AS srcTable    // отсюда получаем информацию по id-ам из constraintaTable
    
    INNER JOIN
    (    // Получение последних идентификаторов на дату с дополнительными условиями
        SELECT
            dbTable.id,
            max(dbTable.data)
        FROM dbTable
        WHERE dbTable.data < @someDate
            AND дополнительные условия на отбор по данным таблицы
    ) AS constraintTable
    
    ON srcTable.id = constraintTable.id
    AND srcTable.data = constraintTable.data


забыл "Group By".

Вот код с исправлением:

// Входные параметры: 
//           @someDate: DATETIME

SELECT
    srcTable.id
    ,srcTable.Name
    ,srcTable.someOtherProperty
    ,srcTable.Date AS [Дата последнего изменения]
    ,@someDate AS [Дата среза]
    
FROM
    dbTable AS srcTable    // отсюда получаем информацию по id-ам из constraintaTable
    
    INNER JOIN
    (    // Получение последних идентификаторов на дату с дополнительными условиями
        SELECT
            dbTable.id,
            max(dbTable.data)
        FROM dbTable
        WHERE dbTable.data < @someDate
        //    AND дополнительные условия на отбор по данным таблицы
        
        [b]GROUP BY dbTable.id[/b]
        
    ) AS constraintTable
    
    ON srcTable.id = constraintTable.id
    AND srcTable.data = constraintTable.data


Не взлетит, потому что вложенный запрос:
        SELECT
            dbTable.id,
            max(dbTable.data)
        FROM dbTable
        WHERE dbTable.data < @someDate


вернет все записи smile.gif

Это делается не так

Vofka Подменю пользователя
сообщение 31.07.12, 16:33
Сообщение #9

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13124
Из: Киев
Спасибо сказали: 3984 раз
Рейтинг: 3115.8

Апну тему smile.gif

Цитата(Flexy @ 25.01.11, 17:12) *
SELECT Max(data), id, id_chel, mesto_raboty
from Ваша База
WHERE id='код'
group by id()

Так и что это получится? Запрос вообще по ходу не отработает, потому что нет группировок по остальным полям. А если добавить группировки, то по всем полям, то получится на выходе эта же таблица в исходном виде.

Цитата(World1С @ 26.01.11, 10:36) *
Select * from base as b1 where Date in (Select MAX(Date) from base as b2 where b1.id=b2.id)

По-моему так нельзя. Какие связи в условии IN ?

Цитата(World1С @ 26.01.11, 10:36) *
Select Max(Date), id from base group by id (ну и все остальные поля которые будут в селекте после id)

Тоже не то пальто, группировка по Id ничего не даст, вернутся все записи, потому что Id каждой записи разный.

Цитата(Pepe @ 09.06.11, 15:55) *
Можно построить индекс и отбор по полю дата, можно без индекса найти последнюю запись и идти назад по условию. При работе с ДБФ легко в Visual Foxpro, да и в 1С реализуется, если я правильно понял задание.

Речь идет про чистый SQL запрос.

Т.е. не один вариант в этой теме, по-моему, не правильный. Предложу свой:

SELECT
    id,
    id_chel,
    mesto_raboty,
    data
FROM
    table AS table
    INNER JOIN
        (
        SELECT
            Max(Data) AS data,
            id_chel
        FROM
            table AS table
        GROUP BY
            id_chel
        ) AS filter
    ON table.id_chel = filter.id_chel
        AND table.data = filter.data


Signature
Пишу программы за деньги

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 13.11.19, 14:50
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!