分析函数中列的sql逗号分隔列表
我正在使用SQLServer2008,我需要创建一个列的常用删除列表。我知道怎么做,但我需要这一次,当我使用分析函数时,我的意思是我不想使用GROUPBY子句。 因为我还将选择外部查询中的记录,其中row_num=1 以下是查询:分析函数中列的sql逗号分隔列表,sql,sql-server-2008,analytics,aggregate-functions,Sql,Sql Server 2008,Analytics,Aggregate Functions,我正在使用SQLServer2008,我需要创建一个列的常用删除列表。我知道怎么做,但我需要这一次,当我使用分析函数时,我的意思是我不想使用GROUPBY子句。 因为我还将选择外部查询中的记录,其中row_num=1 以下是查询: SELECT UserId ,ProductList ,Value FROM ( SELECT p.UserId ,p.Value , ROW_NUMBER()OVER (PARTITION BY p.UserId
SELECT UserId
,ProductList
,Value
FROM
(
SELECT p.UserId
,p.Value
, ROW_NUMBER()OVER (PARTITION BY p.UserId ORDER BY p.RecordCreateDate asc) AS 'row_num'
--here I need a solution OVER (PARTITION BY p.UserId) AS 'ProductList'
FROM Products p
INNER JOIN
Users u
ON p.UserId = u.Id
) result
WHERE result.row_num = 1
用户数据:
Id Name ....
1 John
2 Anton
3 Craig
产品数据:
Id UserId Name RecordCreateDate Value
1 1 a 21.12.2012 10
2 1 b 11.12.2012 20
3 1 c 01.12.2012 30
4 2 e 05.12.2012 40
5 2 f 17.12.2012 50
6 3 d 21.12.2012 60
7 3 i 31.12.2012 70
我需要一个结果,例如:
UserId ProductList Value
1 a,b,c 30
2 e,f 40
3 d,i 60
感谢您的帮助我不确定您在开始时要求什么,但这将为您提供所需的输出
SELECT UserId,
STUFF((SELECT ',' + ProductName from Products p WHERE p.UserID = u.UserID FOR XML PATH('')), 1, 1, '') as ProductList
FROM Users u
我不确定您一开始问的是什么,但这将为您提供所需的输出
SELECT UserId,
STUFF((SELECT ',' + ProductName from Products p WHERE p.UserID = u.UserID FOR XML PATH('')), 1, 1, '') as ProductList
FROM Users u
因为您要对第_num=1行进行筛选,所以需要将查询放入CTE或类似文件中,其中包括Products中的额外列。然后,可以在外部查询中使用for XML路径技巧构建逗号分隔字符串,而无需使用group by
;WITH C as
(
SELECT p.UserId
, ROW_NUMBER()OVER (PARTITION BY p.UserId ORDER BY p.RecordCreateDate asc) AS 'row_num'
--, Some other fields from Products
FROM Products p
INNER JOIN
Users u
ON p.UserId = u.Id
)
SELECT UserId,
--, Some other fields from Products
--, Build the concatenated list here using for xml path()
FROM C
WHERE C.row_num = 1
因为您要对第_num=1行进行筛选,所以需要将查询放入CTE或类似文件中,其中包括Products中的额外列。然后,可以在外部查询中使用for XML路径技巧构建逗号分隔字符串,而无需使用group by
;WITH C as
(
SELECT p.UserId
, ROW_NUMBER()OVER (PARTITION BY p.UserId ORDER BY p.RecordCreateDate asc) AS 'row_num'
--, Some other fields from Products
FROM Products p
INNER JOIN
Users u
ON p.UserId = u.Id
)
SELECT UserId,
--, Some other fields from Products
--, Build the concatenated list here using for xml path()
FROM C
WHERE C.row_num = 1
只是为了完整。删除实际解决方案的符号
SET NOCOUNT ON;
CREATE TABLE #users
(
Id INT,
Name VARCHAR(32)
);
INSERT #users VALUES
(1,'John'),
(2,'Anton'),
(3,'Craig');
CREATE TABLE #products
(
Id INT,
UserId INT,
Name VARCHAR(32),
RecordCreateDate DATE,
Value INT
);
INSERT #products VALUES
(1,1,'a','2012-12-21',10),
(2,1,'b','2012-12-11',20),
(3,1,'c','2012-12-01',30),
(4,2,'e','2012-12-05',40),
(5,2,'f','2012-12-17',50),
(6,3,'d','2012-12-21',60),
(7,3,'i','2012-12-31',70);
查询:
;WITH x AS
(
SELECT UserId, Value,
row_num = ROW_NUMBER() OVER
(
PARTITION BY UserId
ORDER BY RecordCreateDate
)
FROM #products
)
SELECT
x.UserId,
u.Name,
ProductList = STUFF((
SELECT ',' + Name
FROM #Products AS p
WHERE p.UserId = x.UserId
FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1,''),
x.Value
FROM x
INNER JOIN #users AS u
ON x.UserId = u.Id
WHERE x.row_num = 1;
然后清理:
DROP TABLE #users, #products;
结果:
UserId Name ProductList Value
1 John a,b,c 30
2 Anton e,f 40
3 Craig d,i 60
只是为了完整。删除实际解决方案的符号
SET NOCOUNT ON;
CREATE TABLE #users
(
Id INT,
Name VARCHAR(32)
);
INSERT #users VALUES
(1,'John'),
(2,'Anton'),
(3,'Craig');
CREATE TABLE #products
(
Id INT,
UserId INT,
Name VARCHAR(32),
RecordCreateDate DATE,
Value INT
);
INSERT #products VALUES
(1,1,'a','2012-12-21',10),
(2,1,'b','2012-12-11',20),
(3,1,'c','2012-12-01',30),
(4,2,'e','2012-12-05',40),
(5,2,'f','2012-12-17',50),
(6,3,'d','2012-12-21',60),
(7,3,'i','2012-12-31',70);
查询:
;WITH x AS
(
SELECT UserId, Value,
row_num = ROW_NUMBER() OVER
(
PARTITION BY UserId
ORDER BY RecordCreateDate
)
FROM #products
)
SELECT
x.UserId,
u.Name,
ProductList = STUFF((
SELECT ',' + Name
FROM #Products AS p
WHERE p.UserId = x.UserId
FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1,''),
x.Value
FROM x
INNER JOIN #users AS u
ON x.UserId = u.Id
WHERE x.row_num = 1;
然后清理:
DROP TABLE #users, #products;
结果:
UserId Name ProductList Value
1 John a,b,c 30
2 Anton e,f 40
3 Craig d,i 60
你没有明白我的意思,我不想用“按条款分组”这个词。你要求的结果对我来说毫无意义。该行编号是如何生效的?您希望如何在任何情况下使用第1行作为任何用户标识?您能否显示示例数据和期望的结果,包括使您的where row_num=1要求有意义的结果?我没明白,因为你解释得不够好。我在您的中没有看到行数,我需要一个结果,例如:section,所以我不知道您希望在每行中看到什么行数。另外,您确定UserId和RecordCreatedDate都来自products表吗?这里我将使用row_num:SELECT UserId,ProductList from SELECT p.UserId,ROW_Number按p.UserId分区按p.RecordCreateDate asc排序为“ROW_num”-这里我需要一个解决方案,通过p.UserId分区为“ProductList”,从产品p内部加入用户u ON p.UserId=u.Id result,其中result.ROW_num=1row_num与group BY一样使用。我不想使用group by,因为我需要再次与Products表进行额外连接以获取记录。请显示示例数据和所需结果。试图读取注释中的伪代码是不可能的。不要担心告诉我们你是否想使用像GroupBy这样的结构——也许我们知道一种有效的方法来做到这一点,而你却没有想到。考虑一下你的问题,因为这些是我想要的结果,而不是我想要的结果。你没有抓住重点,我不想使用“按条款分组”。你要求的结果对我来说没有意义。该行编号是如何生效的?您希望如何在任何情况下使用第1行作为任何用户标识?您能否显示示例数据和期望的结果,包括使您的where row_num=1要求有意义的结果?我没明白,因为你解释得不够好。我在您的中没有看到行数,我需要一个结果,例如:section,所以我不知道您希望在每行中看到什么行数。另外,您确定UserId和RecordCreatedDate都来自products表吗?这里我将使用row_num:SELECT UserId,ProductList from SELECT p.UserId,ROW_Number按p.UserId分区按p.RecordCreateDate asc排序为“ROW_num”-这里我需要一个解决方案,通过p.UserId分区为“ProductList”,从产品p内部加入用户u ON p.UserId=u.Id result,其中result.ROW_num=1row_num与group BY一样使用。我不想使用group by,因为我需要再次与Products表进行额外连接以获取记录。请显示示例数据和所需结果。试图读取注释中的伪代码是不可能的。不要担心告诉我们你是否想使用像GroupBy这样的结构——也许我们知道一种有效的方法来做到这一点,而你却没有想到。想想你的问题,因为这些是我想要的结果,而不是我想要的结果。他似乎也需要其中的行数,我想这代表了每个用户创建的最早的产品。但是按UserID划分,我不明白他怎么能为每个UserID得到除1之外的任何东西。他似乎也需要其中的row_num,我想这代表了每个用户创建的最早的产品。但是按用户ID划分,我不明白他怎么能为每个用户ID得到除1以外的任何东西。谢谢。我会试试看,然后告诉你
脚踝。我会试试的,让你知道谢谢。我看不到Users表,我需要在CTE查询后使用Join吗?您需要从Users表中获得什么?您想要的结果中没有任何东西表明需要从该连接中获得任何东西。你的问题还缺少一些信息吗?谢谢。我看不到Users表,我需要在CTE查询后使用Join吗?您需要从Users表中获得什么?您想要的结果中没有任何东西表明需要从该连接中获得任何东西。你的问题还缺少一些信息吗?