Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сопоставить вопрос и ответ / 7 сообщений из 7, страница 1 из 1
14.02.2020, 16:40
    #39926789
minya13_85
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сопоставить вопрос и ответ
Microsoft SQL Server 2017 (RTM-CU11) (KB4462262) - 14.0.3038.14 (X64) Sep 14 2018 13:53:44 Copyright (C) 2017 Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: )

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
DECLARE @s TABLE(id INT IDENTITY(1,1),subjectMessage INT,[Message] VARCHAR(8000),typeMessage INT,userID int,adate SMALLDATETIME)
INSERT INTO @s
(
    subjectMessage,
    Message,
    typeMessage,
	userID,
    adate
)
SELECT 25,'Добрый день коллеги готова ли виза?',1,12,'2020-02-01 11:08:00'
UNION
SELECT 25,'Добрый день виза готова',0,116,'2020-02-02 12:22:00'
UNION
SELECT 38,'Добрый день коллеги, отель забронирован?',1,12,'2020-02-03 13:02:00'
UNION
SELECT 38,'Будет ли в отеле автомобиль на прокат?',1,12,'2020-02-03 13:12:00'
UNION
SELECT 38,'Да, отель забронирован по адресу ул. Ленина 256',0,356,'2020-02-03 14:05:00'
UNION
SELECT 38,'Автомобиля к сожалению нету, придется воспользоваться сторонней компанией',0,324,'2020-02-03 15:06:00'
UNION
SELECT 38,'Я вам подыскал компанию по прокату автомобиля позвоните по номеру 77777',0,324,'2020-02-03 17:32:00'
UNION
SELECT 38,'А пока вам будет предоставлен водитель Иванов',0,324,'2020-02-03 18:16:00'
UNION
SELECT 38,'Спасибо автомобиль забронировал, водитель не нужен, закажу такси',1,12,'2020-02-04 09:02:00'
UNION
SELECT 38,'водителя отменил, приятного отдыха',0,324,'2020-02-04 12:00:00'
UNION
SELECT 18,'Какого числа обратный рейс?',1,12,'2020-02-05 12:00:00'


SELECT * FROM @s ORDER BY adate


subjectMessage - тема сообщения
Message - текст сообщения
typeMessage - тип сообщения (1- вопрос, 0-ответ)
userID - автор сообщения
adate - дата создания сообщения

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

Т.е. получить таблицу вида:

ID subjectMessageMessageQuestionMessageAnsweruserIDQuestionuserIDAnsweradateQuestionadateAnswer125 Добрый день коллеги готова ли виза? Добрый день виза готова12116 2020-02-01 11:08:00 2020-02-02 12:22:00238Добрый день коллеги отель забронирован? Да отель забронирован по адресу ул. Ленина 256123562020-02-03 13:02:00 2020-02-03 14:05:00338Будет ли в отеле автомобиль на прокат?Автомобиля к сожалению нету придется воспользоваться сторонней компанией123242020-02-03 13:12:002020-02-03 15:06:00438Спасибо автомобиль забронировал водитель не нужен закажу таксиводителя отменил приятного отдыха123242020-02-04 09:02:002020-02-04 12:00:00518Какого числа обратный рейс?null12null2020-02-05 12:00:00null
...
Рейтинг: 0 / 0
14.02.2020, 16:41
    #39926791
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сопоставить вопрос и ответ
minya13_85,

нейронка? :)
...
Рейтинг: 0 / 0
14.02.2020, 17:00
    #39926809
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сопоставить вопрос и ответ
StarikNavy,

ТС прост как три копейки. Решил, что SQL сервер предназначен для решения задач искусственного интеллекта.

Есть нынче из SQL Server выход на Python и R и там там есть библиотеки какие-то.

А вообще надо гуглить в cторону TensorFlow и отправляться на https://www.kaggle.com/ .
...
Рейтинг: 0 / 0
14.02.2020, 18:01
    #39926850
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сопоставить вопрос и ответ
minya13_85
если ответов больше чем вопросов в одной теме, то первый неиспользованный ответ в теме вопроса
"сложная" фраза :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
;with cte1 as
	(SELECT *, rn=row_number()over(partition by subjectMessage order by adate) FROM @s where typeMessage = 1),
cte0 as 
	(SELECT *, rn=row_number()over(partition by subjectMessage order by adate) FROM @s where typeMessage = 0)

select 
	cte1.subjectMessage
	,MessageQuestion=cte1.Message
	,MessageAnswer	=case when lead(cte1.id)over(partition by cte1.subjectMessage order by cte1.adate)is null then b.Message else a.Message end
	,userIDQuestion	=cte1.id
	,userIDAnswer	=case when lead(cte1.id)over(partition by cte1.subjectMessage order by cte1.adate) is null then b.id else a.id end
	,adateQuestion	=cte1.adate
	,adateAnswer	=case when lead(cte1.id)over(partition by cte1.subjectMessage order by cte1.adate) is null then b.adate else a.adate end
from cte1
outer apply (select * from cte0 where cte1.subjectMessage = cte0.subjectMessage and cte1.rn = cte0.rn) a
outer apply (select top 1 * from cte0 where cte1.subjectMessage = cte0.subjectMessage and cte0.rn >= cte1.rn order by cte0.rn desc) b


subjectMessagetMessageQuestiontMessageAnswertuserIDQuestiontuserIDAnswertadateQuestiontadateAnswer18tКакого числа обратный рейс?tNULLt1tNULLt2020-05-02 12:00:00tNULL25tДобрый день коллеги готова ли виза?tДобрый день виза готоваt3t2t2020-01-02 11:08:00t2020-02-02 12:22:0038tДобрый день коллеги, отель забронирован?tДа, отель забронирован по адресу ул. Ленина 256t9t8t2020-03-02 13:02:00t2020-03-02 14:05:0038tБудет ли в отеле автомобиль на прокат?tАвтомобиля к сожалению нету, придется воспользоваться сторонней компаниейt6t5t2020-03-02 13:12:00t2020-03-02 15:06:0038tСпасибо автомобиль забронировал, водитель не нужен, закажу таксиtводителя отменил, приятного отдыхаt10t7t2020-04-02 09:02:00t2020-04-02 12:00:00
...
Рейтинг: 0 / 0
14.02.2020, 18:08
    #39926851
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сопоставить вопрос и ответ
редактирование "ломает" таблицу ... :(

subjectMessageMessageQuestionMessageAnsweruserIDQuestionuserIDAnsweradateQuestionadateAnswer18Какого числа обратный рейс?NULL1NULL2020-05-02 12:00:00NULL25Добрый день коллеги готова ли виза?Добрый день виза готова322020-01-02 11:08:002020-02-02 12:22:0038Добрый день коллеги, отель забронирован?Да, отель забронирован по адресу ул. Ленина 256982020-03-02 13:02:002020-03-02 14:05:0038Будет ли в отеле автомобиль на прокат?Автомобиля к сожалению нету, придется воспользоваться сторонней компанией652020-03-02 13:12:002020-03-02 15:06:0038Спасибо автомобиль забронировал, водитель не нужен, закажу таксиводителя отменил, приятного отдыха1072020-04-02 09:02:002020-04-02 12:00:00
...
Рейтинг: 0 / 0
14.02.2020, 19:55
    #39926906
minya13_85
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сопоставить вопрос и ответ
court
minya13_85
если ответов больше чем вопросов в одной теме, то первый неиспользованный ответ в теме вопроса
"сложная" фраза :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
;with cte1 as
	(SELECT *, rn=row_number()over(partition by subjectMessage order by adate) FROM @s where typeMessage = 1),
cte0 as 
	(SELECT *, rn=row_number()over(partition by subjectMessage order by adate) FROM @s where typeMessage = 0)

select 
	cte1.subjectMessage
	,MessageQuestion=cte1.Message
	,MessageAnswer	=case when lead(cte1.id)over(partition by cte1.subjectMessage order by cte1.adate)is null then b.Message else a.Message end
	,userIDQuestion	=cte1.id
	,userIDAnswer	=case when lead(cte1.id)over(partition by cte1.subjectMessage order by cte1.adate) is null then b.id else a.id end
	,adateQuestion	=cte1.adate
	,adateAnswer	=case when lead(cte1.id)over(partition by cte1.subjectMessage order by cte1.adate) is null then b.adate else a.adate end
from cte1
outer apply (select * from cte0 where cte1.subjectMessage = cte0.subjectMessage and cte1.rn = cte0.rn) a
outer apply (select top 1 * from cte0 where cte1.subjectMessage = cte0.subjectMessage and cte0.rn >= cte1.rn order by cte0.rn desc) b


subjectMessagetMessageQuestiontMessageAnswertuserIDQuestiontuserIDAnswertadateQuestiontadateAnswer18tКакого числа обратный рейс?tNULLt1tNULLt2020-05-02 12:00:00tNULL25tДобрый день коллеги готова ли виза?tДобрый день виза готоваt3t2t2020-01-02 11:08:00t2020-02-02 12:22:0038tДобрый день коллеги, отель забронирован?tДа, отель забронирован по адресу ул. Ленина 256t9t8t2020-03-02 13:02:00t2020-03-02 14:05:0038tБудет ли в отеле автомобиль на прокат?tАвтомобиля к сожалению нету, придется воспользоваться сторонней компаниейt6t5t2020-03-02 13:12:00t2020-03-02 15:06:0038tСпасибо автомобиль забронировал, водитель не нужен, закажу таксиtводителя отменил, приятного отдыхаt10t7t2020-04-02 09:02:00t2020-04-02 12:00:00


При добавлении еще вопросов и ответов, не совсем правильно срабатывает:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
DECLARE @s TABLE(id INT IDENTITY(1,1),subjectMessage INT,[Message] VARCHAR(8000),typeMessage INT,userID int,adate SMALLDATETIME)
INSERT INTO @s
(
    subjectMessage,
    Message,
    typeMessage,
	userID,
    adate
)
SELECT 25,'Добрый день коллеги готова ли виза?',1,12,'2020-02-01 11:08:00'
UNION
SELECT 25,'Добрый день виза готова',0,116,'2020-02-02 12:22:00'
UNION
SELECT 38,'Добрый день коллеги, отель забронирован?',1,12,'2020-02-03 13:02:00'
UNION
SELECT 38,'Будет ли в отеле автомобиль на прокат?',1,12,'2020-02-03 13:12:00'
UNION
SELECT 38,'Да, отель забронирован по адресу ул. Ленина 256',0,356,'2020-02-03 14:05:00'
UNION
SELECT 38,'Автомобиля к сожалению нету, придется воспользоваться сторонней компанией',0,324,'2020-02-03 15:06:00'
UNION
SELECT 38,'Я вам подыскал компанию по прокату автомобиля позвоните по номеру 77777',0,324,'2020-02-03 17:32:00'
UNION
SELECT 38,'А пока вам будет предоставлен водитель Иванов',0,324,'2020-02-03 18:16:00'
UNION
SELECT 38,'Спасибо автомобиль забронировал, водитель не нужен, закажу такси',1,12,'2020-02-04 09:02:00'
UNION
SELECT 38,'водителя отменил, приятного отдыха',0,324,'2020-02-04 12:00:00'
UNION
SELECT 38,'К вам в отель направил подарок',0,324,'2020-02-04 12:15:00'
UNION
SELECT 38,'Спасибо не надо было',1,12,'2020-02-04 12:30:00'
UNION
SELECT 18,'Какого числа обратный рейс?',1,12,'2020-02-05 12:00:00'



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

При таком добавлении , получить таблицу вида

ID subjectMessage MessageQuestion MessageAnswer userIDQuestion userIDAnswer adateQuestion adateAnswer1 25 Добрый день коллеги готова ли виза?Добрый день виза готова121162020-02-01 11:08:002020-02-02 12:22:00238Добрый день коллеги отель забронирован?Да отель забронирован по адресу ул. Ленина 25612356 2020-02-03 13:02:002020-02-03 14:05:00338 Будет ли в отеле автомобиль на прокат?Автомобиля к сожалению нету придется воспользоваться сторонней компанией123242020-02-03 13:12:002020-02-03 15:06:00438Спасибо автомобиль забронировал водитель не нужен закажу таксиводителя отменил приятного отдыха123242020-02-04 09:02:002020-02-04 12:00:00538Спасибо не надо былоnull12null2020-02-04 12:30:00null618Какого числа обратный рейс? null12null2020-02-05 12:00:00null
...
Рейтинг: 0 / 0
15.02.2020, 02:41
    #39926963
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сопоставить вопрос и ответ
А что отвечает на ваши вопросы архитектор этой схемы данных?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сопоставить вопрос и ответ / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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