Sql 如何组合第一个和第二个select语句
第一条select语句填充空值,第二条select语句删除重复项。如何从第一条SQL语句运行第二条SQL语句,或者是否有方法将它们组合起来 下面是SQL小提琴: 首先选择Sql 如何组合第一个和第二个select语句,sql,sql-server,select,group-by,Sql,Sql Server,Select,Group By,第一条select语句填充空值,第二条select语句删除重复项。如何从第一条SQL语句运行第二条SQL语句,或者是否有方法将它们组合起来 下面是SQL小提琴: 首先选择 /* Fill in null values with last record that is not null */ SELECT Id, FirstName, LastName, ISNULL(Address, ( SELECT TOP (1) Address FROM test WHERE (F
/*
Fill in null values with last record that is not null
*/
SELECT Id, FirstName, LastName,
ISNULL(Address,
(
SELECT TOP (1) Address
FROM test
WHERE (FirstName = MainTable.FirstName) AND (Address IS NOT NULL) AND (Address <> '')
ORDER BY Id DESC)
) AS Address
FROM test AS MainTable
/*
Return a single record
*/
SELECT FirstName, LastName, MAX(Address)
FROM test
Group By FirstName, LastName
预期结果:
| 4, john, doe, 9Street, SC |
| 5, marry, doe, 78Street, DC |
据我所知,您希望最新(按Id)地址和城市不为空,对吗?如果是:
SELECT max(t1.id) as id, t1.firstName, t1.lastName, adr.address, cty.City
FROM test t1
cross apply (select top(1) address from test t2
where t1.FirstName = t2.FirstName and
t1.LastName = t2.LastName and
t2.address is not null
order by id desc) adr(Address)
cross apply (select top(1) city from test t2
where t1.FirstName = t2.FirstName and
t1.LastName = t2.LastName and
t2.city is not null
order by id desc) cty(City)
group by t1.firstName, t1.lastName, adr.address, cty.City;
如果您使用的是SQL Server 2012版或更高版本,则可以使用
last\u value()
获取有序行(此处为id
)分区(此处为firstname
和lastname
)中的最后一个值
不幸的是,它不允许忽略NULL
s。但是,如果我们将感兴趣的列为NULL的行排序在不为NULL的行之前,我们就可以解决这个问题。如果列为空,我们可以首先按大小写进行排序,如果列为空,则返回一个较低的值;如果列为空,则返回一个较高的值。第二列是orderby
是id
如果每个firstname
和lastname
只获取一行,那么简单的DISTINCT
就可以了,因为地址和城市和在共享firstname
和lastname
的任何行中都是相同的
SELECT DISTINCT
t1.firstname,
t1.lastname,
last_value(t1.address) OVER (PARTITION BY t1.firstname,
t1.lastname
ORDER BY CASE
WHEN t1.address IS NULL THEN
-1
ELSE
1
END,
t1.id
RANGE BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING) address,
last_value(t1.city) OVER (PARTITION BY t1.firstname,
t1.lastname
ORDER BY CASE
WHEN t1.city IS NULL THEN
-1
ELSE
1
END,
t1.id
RANGE BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING) city
FROM test t1;
如果您使用的是SQLServer2012
或更高版本,sticky bit
answer看起来是最好的答案。如果您使用的是较低版本,则可以检查以下答案
SELECT
CAST((CASE
WHEN CHARINDEX('$', Id) > 0
THEN RIGHT(Id, CHARINDEX('$', REVERSE(Id)) - 1)
ELSE Id
END
) AS INT) AS Id,
Firstname, Lastname,
(CASE
WHEN CHARINDEX('$', Address) > 0
THEN RIGHT(Address, CHARINDEX('$', REVERSE(Address)) - 1)
ELSE Address
END
) AS Address,
(CASE
WHEN CHARINDEX('$', City) > 0
THEN RIGHT(City, CHARINDEX('$', REVERSE(City)) - 1)
ELSE City
END
) AS City
FROM (
SELECT A.Firstname, A.Lastname,
STUFF((
SELECT '$' + CAST(B.Id AS VARCHAR)
FROM test B
WHERE B.Firstname = A.Firstname
AND
B.Lastname = A.Lastname
For XML Path('')),1,1,'') AS Id,
STUFF((
SELECT '$' + B.Address
FROM test B
WHERE B.Firstname = A.Firstname
AND
B.Lastname = A.Lastname
For XML Path('')),1,1,'') AS Address,
STUFF((
SELECT '$' + B.City
FROM test B
WHERE B.Firstname = A.Firstname
AND
B.Lastname = A.Lastname
For XML Path('')),1,1,'') AS City
FROM test A
GROUP BY A.Firstname, A.Lastname
) T
我认为标题是错误的,应该是“如何获取不同列的最新值”
还希望您的表应该包含EmpID
或USERID
,以便可以在其上创建索引
或者,如果可能,表格可以进一步标准化
Create table Table1(Empid int pk,FirstName,LastName)
Create table Table2(id int identity(1,1),EMPID FK,Adress,city)
查询这两个表将非常有效
SELECT DISTINCT t.Firstname
,t.Lastname
,t1.Address
,t2.City
FROM #test t
CROSS APPLY (
SELECT TOP 1 t1.Address
FROM #test t1
WHERE t1.Address IS NOT NULL
AND t.Firstname = t1.Firstname
AND t.Lastname = t1.Lastname
ORDER BY t1.id DESC
) t1
CROSS APPLY (
SELECT TOP 1 t2.City
FROM #test t2
WHERE t2.City IS NOT NULL
AND t.Firstname = t2.Firstname
AND t.Lastname = t2.Lastname
ORDER BY t2.id DESC
) t2
你期望的结果是什么?| 4,john,doe,9Street,SC | | 5,Mary,doe,78Street,DC |基本上这两个select语句填充空值,然后删除重复项。