Sql 需要按日期排序的以逗号分隔的不同产品值
我有下面的表格结构Sql 需要按日期排序的以逗号分隔的不同产品值,sql,sql-server,csv,sql-order-by,distinct,Sql,Sql Server,Csv,Sql Order By,Distinct,我有下面的表格结构 create TABLE PRODUCTDeatils ( Product varchar(50), Date Datetime ) 我想要一个输出,其中我得到逗号分隔的列表,具有不同的值,但按日期排序 我首先通过下面的查询拆分这些值 SELECT DISTINCT LTRIM(RTRIM(value)) AS Product, date INTO #tmp3 FROM PRODUCTDeatils CROSS APPLY STRING_SPLI
create TABLE PRODUCTDeatils
(
Product varchar(50),
Date Datetime
)
我想要一个输出,其中我得到逗号分隔的列表,具有不同的值,但按日期排序
我首先通过下面的查询拆分这些值
SELECT DISTINCT
LTRIM(RTRIM(value)) AS Product, date
INTO #tmp3
FROM PRODUCTDeatils
CROSS APPLY STRING_SPLIT(LTRIM(RTRIM(Product)), ',')
SELECT *
FROM #tmp3
ORDER BY date
然后我使用下面两个查询来实现它,但没有成功
问题#1:
问题2:
我想要像上面那样的输出,但是bat应该只出现一次。您可以添加
行号
,并且每个产品只选择一个值
SELECT DISTINCT
LTRIM(RTRIM(value)) AS Product, date, ROW_NUMBER() over (partition by trim(Value) order by date) rn
INTO #tmp3
FROM PRODUCTDeatils
CROSS APPLY STRING_SPLIT(LTRIM(RTRIM(Product)), ',')
SELECT
STUFF((SELECT '; ' + Product
FROM
(SELECT DISTINCT TOP 100
Product,date
FROM #tmp3 where rn = 1) x
ORDER BY date
FOR XML PATH('')), 1, 2, '') Text
请在较新版本的SQL Server中找到dbfiddle,您只需使用
string\u agg()
:
是一个dbfiddle。而不是单独切换到聚合:
LTRIM(RTRIM(value))作为产品,MIN(date)
在查询中#2.规范化架构。阅读。请显示您想要的结果。
SELECT
STUFF((SELECT '; ' + Product
FROM
(SELECT DISTINCT TOP 100
Product,date
FROM #tmp3) x
ORDER BY date
FOR XML PATH('')), 1, 2, '') Text
SELECT DISTINCT
LTRIM(RTRIM(value)) AS Product, date, ROW_NUMBER() over (partition by trim(Value) order by date) rn
INTO #tmp3
FROM PRODUCTDeatils
CROSS APPLY STRING_SPLIT(LTRIM(RTRIM(Product)), ',')
SELECT
STUFF((SELECT '; ' + Product
FROM
(SELECT DISTINCT TOP 100
Product,date
FROM #tmp3 where rn = 1) x
ORDER BY date
FOR XML PATH('')), 1, 2, '') Text
SELECT STRING_AGG(Product, ',') WITHIN GROUP (ORDER BY date)
FROM (SELECT LTRIM(RTRIM(s.value)) AS Product, MIN(date) as date
FROM ProductDetails pd CROSS APPLY
STRING_SPLIT(LTRIM(RTRIM(pd.Product)), ',') s
GROUP BY LTRIM(RTRIM(s.value))
) p