SQL代码,用于为查询中字段的每个唯一值选择一行
我对下表有一个建议:SQL代码,用于为查询中字段的每个唯一值选择一行,sql,vba,ms-access,ms-access-2013,Sql,Vba,Ms Access,Ms Access 2013,我对下表有一个建议: | ClientID | Status | Date | | ---------- | --------- | --------- | | 1 | -1 | 3/1/2016 | | 1 | 0 | 5/5/2016 | | 2 | 0 | 3/21/2016 | | 2 | -1 | 4/16/2016 | | 2
| ClientID | Status | Date |
| ---------- | --------- | --------- |
| 1 | -1 | 3/1/2016 |
| 1 | 0 | 5/5/2016 |
| 2 | 0 | 3/21/2016 |
| 2 | -1 | 4/16/2016 |
| 2 | 0 | 5/1/2016 |
| 3 | 0 | 4/10/2016 |
| 3 | -1 | 5/6/2016 |
| 4 | 0 | 5/8/2016 |
我需要我的结果为每个ClientID有一行,如果该ClientID在表中的任何一行上的状态为-1,则优先于值0。结果应该是:
| ClientID | Status | Date |
| ---------- | --------- | --------- |
| 1 | -1 | 3/1/2016 |
| 2 | -1 | 4/16/2016 |
| 3 | -1 | 5/6/2016 |
| 4 | 0 | 5/8/2016 |
我试了又试,在StackExchange上看了其他类似的问题,但似乎没有得到我想要的结果。感谢您的帮助。尝试将问题分解为逻辑步骤,然后尝试从中优化:
--Prioritise on Status == -1
select *
from ClientTable
where Status=-1
UNION
--Add any remaining rows, I guess you are only interested in one, not sure which one so chose top one
select top 1 *
from ClientTable
where ClientID not in (
select ClientID
from ClientTable
where Status=-1
)
尝试将问题分解为逻辑步骤,然后尝试从中优化:
--Prioritise on Status == -1
select *
from ClientTable
where Status=-1
UNION
--Add any remaining rows, I guess you are only interested in one, not sure which one so chose top one
select top 1 *
from ClientTable
where ClientID not in (
select ClientID
from ClientTable
where Status=-1
)
我会这样尝试:
SELECT tblStatus.ClientID, Max(tblStatus.Date) AS Date
FROM tblStatus
WHERE tblStatus.Status=
(
SELECT MIN(Status)
FROM tblStatus Status
WHERE ClientID=tblStatus.ClientID
)
GROUP BY tblStatus.ClientID
我会这样尝试:
SELECT tblStatus.ClientID, Max(tblStatus.Date) AS Date
FROM tblStatus
WHERE tblStatus.Status=
(
SELECT MIN(Status)
FROM tblStatus Status
WHERE ClientID=tblStatus.ClientID
)
GROUP BY tblStatus.ClientID
假设一个客户端有多个状态为-1的行?如果这些行具有不同的日期,则必须选择要显示的日期。你怎么解决这个问题呢?顺便说一下,你不会指定一个字段日期吧?Date是Access中的一个专用关键字,使用它作为名称是个坏主意。是的,这只是一个伪表。多个-1值无关紧要,具体日期并不重要。如果客户机有多行状态为-1?如果这些行具有不同的日期,则必须选择要显示的日期。你怎么解决这个问题呢?顺便说一下,你不会指定一个字段日期吧?Date是Access中的一个专用关键字,使用它作为名称是个坏主意。是的,这只是一个伪表。多个-1值无关紧要,具体日期并不重要。您需要将其粘贴到SQL视图中,因为Access的查询设计界面不支持这种方法。但是你可以嵌套一个查询——这是应用这个解决方案的一种方式。这个解决方案会丢失没有-1值的客户端。因此,T33C的答案可能更好。不过,我认为这一点是可以实现的?@Smandoli请解释一下,如果客户机只有0值,那么它将如何失败。我运行了一个测试,它返回了预期的数据集。这是伟大的,它是完美的工作。这段代码中到底发生了什么?我知道嵌套查询为每个ClientID提取Status的最小值,但是代码中的什么导致每个客户机只选择1行?那是团体票吗?我以前也从未使用过HAVING函数,因此我将仔细阅读。实际上HAVING子句是不必要的,我更新了答案以反映这一点。您需要将其粘贴到SQL视图中,因为Access的查询设计界面不利于此方法。但是你可以嵌套一个查询——这是应用这个解决方案的一种方式。这个解决方案会丢失没有-1值的客户端。因此,T33C的答案可能更好。不过,我认为这一点是可以实现的?@Smandoli请解释一下,如果客户机只有0值,那么它将如何失败。我运行了一个测试,它返回了预期的数据集。这是伟大的,它是完美的工作。这段代码中到底发生了什么?我知道嵌套查询为每个ClientID提取Status的最小值,但是代码中的什么导致每个客户机只选择1行?那是团体票吗?我以前也从未使用过HAVING函数,所以我会仔细阅读。实际上HAVING子句是不必要的,我更新了答案以反映这一点。