我怎样才能为每个客户从 table 中只获取 1 个值,并从相同但具有不同值的所有值中获取
How can i get only 1 value from table for each client and get all values from the same but with different value
我需要查询构建位置,如果客户端的状态为“5”,那么我会得到所有行,如果客户端只有“6”的状态,那么我只会从中得到一个和最新的
CREATE TABLE #test (
ClientID INT NULL,
StatusID INT NULL,
Date DATE null
)
INSERT INTO #test
(
ClientID,
StatusID,
Date
)
SELECT 1001,5,'20190909'
UNION all
SELECT 1001,5,'20190908'
UNION all
SELECT 1002,5,'20190909'
UNION all
SELECT 1002,6,'20190910'
UNION all
SELECT 1003,6,'20190909'
UNION all
SELECT 1003,6,'20190910'
如果 latest 表示 max(date) 那么 :
select top 1 *
from
test
where StatusID=6
union all(
select * from
test
where StatusID=5)
order by Date desc
检查这个sqfiddle
您的问题是如果客户有任何行 StatusID = 5
那么您需要该客户的所有行。如果客户端只有 StatusID = 6
行,您只需要最新的行。
下面的 SQL 这样做
WITH T
AS (SELECT *,
HasStatus5 = SIGN(SUM(IIF(StatusID = 5, 1, 0)) OVER (PARTITION BY ClientID)),
LatestDate = MAX(Date) OVER (PARTITION BY ClientID)
FROM #test
WHERE StatusID IN ( 5, 6 ))
SELECT ClientID,
StatusID,
Date
FROM T
WHERE HasStatus5 = 1
OR Date = LatestDate
我需要查询构建位置,如果客户端的状态为“5”,那么我会得到所有行,如果客户端只有“6”的状态,那么我只会从中得到一个和最新的
CREATE TABLE #test (
ClientID INT NULL,
StatusID INT NULL,
Date DATE null
)
INSERT INTO #test
(
ClientID,
StatusID,
Date
)
SELECT 1001,5,'20190909'
UNION all
SELECT 1001,5,'20190908'
UNION all
SELECT 1002,5,'20190909'
UNION all
SELECT 1002,6,'20190910'
UNION all
SELECT 1003,6,'20190909'
UNION all
SELECT 1003,6,'20190910'
如果 latest 表示 max(date) 那么 :
select top 1 *
from
test
where StatusID=6
union all(
select * from
test
where StatusID=5)
order by Date desc
检查这个sqfiddle
您的问题是如果客户有任何行 StatusID = 5
那么您需要该客户的所有行。如果客户端只有 StatusID = 6
行,您只需要最新的行。
下面的 SQL 这样做
WITH T
AS (SELECT *,
HasStatus5 = SIGN(SUM(IIF(StatusID = 5, 1, 0)) OVER (PARTITION BY ClientID)),
LatestDate = MAX(Date) OVER (PARTITION BY ClientID)
FROM #test
WHERE StatusID IN ( 5, 6 ))
SELECT ClientID,
StatusID,
Date
FROM T
WHERE HasStatus5 = 1
OR Date = LatestDate