I am using SQL Server database which has tables x, y and mapping table xy.
I have a table X with x_id, date, text and receiver id and mapping table xy with x_id and y_id. I need a script to generate XY and Y tables in such a way that for each unique text there should be a record in y table and based on number of receivers there should be mapping in XY table. date column in Y table should be populated with shortest date for that specific text.
Table: x
x_id date text receiver
---------------------------------------------------------
| 1 | 2019-02-22 20:40:30.617 | txt1 | 4
| 2 | 2019-02-22 20:40:06.103 | txt1 | 5
| 3 | 2019-02-22 20:28:21.393 | txt2 | 4
So, final data in XY & Y for the above records should end up with
Table: Y
y_id date text
---------------------------------------------
| 1 | 2019-02-22 20:40:06.103 | txt1 |
| 2 | 2019-02-22 20:28:21.393 | txt2 |
Table: XY
y_id x_id
-----------
| 1 | 1
| 1 | 2
| 2 | 3
Advertisement
Answer
first get the data fro Y table and insert, I have used Row Number for Id of Y table, you can create identity for that if you want. second select data for XY table with join with X and Y table text property.
please do not use any keyword for field name like text or date.
DECLARE @x TABLE(
x_id int,
date datetime,
text varchar(100),
receiver int
)
insert INTO @x
(
x_id,
[date],
[text],
receiver
)
VALUES
(1,'2019-02-22 20:40:30.617 ','txt1',4),
(2,'2019-02-22 20:40:06.103 ','txt1',5),
(3,'2019-02-22 20:28:21.393 ','txt2',4)
--for Y table
--insert into Y
SELECT ROW_NUMBER() OVER(ORDER BY [text] ASC) AS Id, Min(date) AS [date], [text]
INTO #Y
FROM @x
GROUP BY [text]
--for XY table
SELECT Y.Id AS y_id, X.x_Id AS x_id FROM @x AS X
INNER JOIN #Y Y ON X.[text] = Y.[text]
DROP TABLE #Y