SQL - 选择具有奇数给定属性的记录

时间:2014-06-20 14:42:34

标签: sql sql-server modulus

我只是在刷一些SQL - 换句话说,我真的生锈 - 而且此刻有点卡住了。它可能是微不足道的,但我们会看到。

我想选择所有具有奇数个特定属性且不是整数的人(在此示例中为TransactionType)。因此,例如,采取以下测试/非真实信息这些人购买汽车或类似的大型购买。

Name TransactionType Date

John   Buy           5/1
John   Cancel        5/1
John   Buy           5/2
Joseph Buy           5/25
Joseph Cancel        5/25
Tanya  Buy           5/28

我希望能让那些交易数量奇怪的人回归;换句话说,他们最终购买了该物品。因此,在这种情况下,John和Tanya将被选中,而Joseph则不会。

我知道我可以在这里使用模数操作数,但我有点失去了如何正确使用它。 我想过用

count(TransactionType) % 2 != 0

在where子句中,但这显然是禁止的。任何正确方向的指针都会非常有用。如果不清楚,请告诉我,谢谢!

2 个答案:

答案 0 :(得分:3)

你很亲密。你需要一个having子句而不是where子句。

select Name
from table
group by Name
having count(TransactionType) % 2 != 0

答案 1 :(得分:2)

您最好在交易日期之前获取最新状态并使用该状态而不是依靠计算TransactionType来确定最新状态:

这样的事情:

SELECT b.Name, b.TransactionType, b.[Date]
FROM (
   SELECT Name, MAX(t1.[DATE]) latestDate
   FROM [Transactions] t1
   GROUP BY t1.Name
   ) a
INNER JOIN [Transactions] b ON b.Name = a.Name AND a.latestDate = b.[Date]
WHERE b.TransactionType = 'Buy'

假设您的日期是包含时间的有效日期,这应该有效。

Sample SQL Fiddle

如果您只存储日期部分,那么购买取消的人在同一日期的最大日期相同,因此它会返回更多数据和一些不正确的记录。