sql - 从查询中获取唯一数据
问题描述
我从这个查询中得到了一些重复的行,但能够理解如何获取唯一序列号(序列号)的数据。
我需要获得
SerialNumber
最新的独特someDate
SET NOCOUNT ON;
DECLARE @myDate datetime ;
SELECT @myDate = someDate FROM X ORDER BY someDate DESC;
SELECT
d.someID,
sd.Id,
d.SerialNr as SerialNumber,
convert(varchar(25), a.someDate, 121) as someDate
FROM A d WITH (NOLOCK)
INNER JOIN B sd ON d.myName = sd.myName
INNER JOIN C a ON sd.AuditID = a.AuditID
WHERE a.someDate > @myDate
GROUP BY d.someID, sd.Id, d.SerialNr, a.someDate
在此查询上方运行时,我得到了此结果,但我需要数据唯一
SerialNUmber
----------------------------------------------------------------
someID | Id | SerialNumber | someDate
----------------------------------------------------------------
1086273 | 1811804430 | CNRXY35780 | 2020-01-30 22:11:07.607
1086273 | 1812119814 | CNRXY35780 | 2020-01-30 22:11:07.607
1086274 | 1811804766 | VNB3R56530 | 2020-01-30 22:11:07.607
1086276 | 1811804641 | U64968D8N889217 | 2020-01-30 22:11:07.607
1086276 | 1812119826 | U64968D8N889217 | 2020-01-30 22:11:07.607
我试过这个但出错了
SET NOCOUNT ON;
;with ABC
(
DECLARE @myDate datetime ;
select @myDate = someDate from X order by someDate desc;
SELECT top 1000
d.someID,
sd.Id,
d.SerialNr as SerialNumber,
convert(varchar(25), a.someDate, 121) as someDate,
ROW_NUMBER()OVER(PARTITION BY d.DeviceId,d.SerialNr ORDER BY a.someDate desc) RID
FROM A d
INNER JOIN B sd ON d.someID = sd.someID
INNER JOIN C a ON sd.AuditID = a.AuditID
WHERE a.someDate > @myDate AND RID = 1
)
select * from ABC
where RID = 1
GROUP BY d.DeviceId,sd.Id,d.SerialNr,a.someDate
这是错误:
Msg 156, Level 15, State 1, Line 4
Incorrect syntax near the keyword 'DECLARE'.
Msg 102, Level 15, State 1, Line 19
Incorrect syntax near ')'.
我也试过这个
SET NOCOUNT ON;
DECLARE @AuditDate datetime;
select @AuditDate = AuditDate from atr_usageSync order by AuditDate desc;
;with ABC AS
(
SELECT top 1000
d.DeviceId,
sd.Id,
d.SerialNr as SerialNumber,
convert(varchar(25), a.AuditDate, 121) as AuditDate,
ROW_NUMBER() OVER (PARTITION BY d.DeviceId,d.SerialNr ORDER BY a.AuditDate desc) RID
FROM Device d
INNER JOIN SuppliesData sd ON d.DeviceId = sd.DeviceId
INNER JOIN Audit a ON sd.AuditID = a.AuditID
WHERE a.AuditDate > @AuditDate
)
select * from ABC
where RID = 1
GROUP BY DeviceId,Id,SerialNumber,AuditDate
这次我得到了这个错误
Msg 8120, Level 16, State 1, Line 4
Column 'ABC.RID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
解决方案
- 在 CTE 之外声明您的变量。
select @myDate = someDate from X order by someDate desc; -- Should be outside cte , below declare -- @myDate will store only one result here.
AS 不见了。
要么尝试:
SET NOCOUNT ON;
DECLARE @myDate datetime ;
select @myDate = someDate from X order by someDate desc;
;with ABC AS
(
SELECT top 1000
d.someID,
sd.Id,
d.SerialNr as SerialNumber,
convert(varchar(25), a.someDate, 121) as someDate,
ROW_NUMBER() OVER (PARTITION BY d.DeviceId,d.SerialNr ORDER BY a.someDate desc) RID
FROM A d
INNER JOIN B sd ON d.someID = sd.someID
INNER JOIN C a ON sd.AuditID = a.AuditID
WHERE a.someDate > @myDate AND RID = 1
)
select * from ABC
where RID = 1
GROUP BY d.someID,sd.Id,d.SerialNumber,a.someDate
或者
SET NOCOUNT ON;
DECLARE @myDate datetime ;
;with ABC AS
(
SELECT top 1000
d.someID,
sd.Id,
d.SerialNr as SerialNumber,
convert(varchar(25), a.someDate, 121) as someDate,
ROW_NUMBER() OVER (PARTITION BY d.DeviceId,d.SerialNr ORDER BY a.someDate desc) RID
FROM A d
INNER JOIN B sd ON d.someID = sd.someID
INNER JOIN C a ON sd.AuditID = a.AuditID
WHERE a.someDate > @myDate AND RID = 1
)
select * from ABC
where RID = 1
GROUP BY d.someID,sd.Id,d.SerialNumber,a.someDate
并将一些日期传递给@myDate。
推荐阅读
- reactjs - 使用 React Hooks 是否会大大减少代码在 React / Redux 中的重用方式?
- arduino - 来自 ADC Arduino 的错误值 - 频率计
- python - 使用 Python 排列列表中的 +1 是什么意思?
- c# - nHibernate 因 whereNot 限制而失败,但因 where 限制而失败
- swift - 受泛型类约束的 Swift 泛型函数
- c++ - 如何打印嵌套 std::unordered_map 的内容?
- python - 来自两个列表的python常用值列表
- botframework - 在 Bot 框架模拟器上测试 LUIS bot 的问题
- swift5 - Xcode 11 Swift 5 在非主线程中更新标签
- symfony - lexik JWT 在解码令牌时出错无效令牌