我是sql的新手,我在我的一个SQL查询中遇到了一个问题。我的问题是,一个人有多个访问日期,他必须符合某些条件。我必须拉最近的资格访问和如果最近的访问不满足条件,那么它应该选择之前符合条件的访问。 例如:
name | visit_dt | x | y | z
A 04/27/'17 1 1 0
A 04/26/'17 1 0 0
B 04/25/'17 1 0 0
B 04/24/'17 1 1 0
C 04/23/'17 1 0 0
C 04/22/'17 1 0 0
在上面的例子中,qe需要一个输出如下: 预期产出:
name | visit_dt | x | y | z
A 04/27/'17 1 1 0
B 04/24/'17 1 1 0
C 04/23/'17 1 0 0
这里的条件是我们应该拉最近的' X'。如果是最新的' X'没有1英寸的Y'然后它应该查找前面的记录,其中Y为1,如果该特定人的所有记录都没有Y为1那么它应该选择最近的' X' 。 我想我的问题很明确。如果有人可以帮助我,那就太好了。
答案 0 :(得分:1)
您可以通过Y desc,visit_dt desc订购并使用CROSS APPLY解决方案:
select distinct(v1.name), v2.visit_dt, v2.x, v2.y, v2.z
from visits v1
cross apply (select top(1) name, visit_dt, x, z, y
from visits
where name = v1.name
order by y desc, visit_dt desc) v2;
结果是一样的:
| name | visit_dt | x | y | z |
|------|---------------------|---|---|---|
| A | 27.04.2017 00:00:00 | 1 | 1 | 0 |
| B | 24.04.2017 00:00:00 | 1 | 1 | 0 |
| C | 23.04.2017 00:00:00 | 1 | 0 | 0 |
性能取决于您的索引。
Rextester here
答案 1 :(得分:0)
我想你可以试试这个:
SELECT NAME
,VISIT_DT
,X
,Y
,Z
FROM (
SELECT *
,ROW_NUMBER() OVER (
PARTITION BY NAME ORDER BY X + Y DESC
,VISIT_DT DESC
) AS RN
FROM MYTABLE
) B
WHERE RN = 1
使用您的样本数据输出:
NAME VISIT_DT X Y Z
--------------------------- ----------------------- ----------- ----------- -----------
A 2017-04-27 00:00:00.000 1 1 0
B 2017-04-24 00:00:00.000 1 1 0
C 2017-04-23 00:00:00.000 1 0 0
答案 2 :(得分:0)
SELECT
[name]
,[visit_dt]
,[x]
,[y]
,[z]
--,[RowNumber] (for testing)
FROM
(
SELECT
[name]
,CONVERT(DATE,REPLACE([visit_dt],'''',''),1) AS [visit_dt]
,[x]
,[y]
,[z]
,ROW_NUMBER() OVER (PARTITION BY [name] ORDER BY (CASE WHEN [y] = 1 THEN [y] END) DESC, CONVERT(DATE,REPLACE([visit_dt],'''',''),1) DESC) AS [RowNumber]
FROM
[DB].[dbo].[Stack]
WHERE
[x] = 1
) AS [Visits]
WHERE
[Visits].[RowNumber] = 1
答案 3 :(得分:0)
那么考虑<div class='col-md-6 body-content'>
<router-outlet></router-outlet>
</div>
然后x
然后y
然后考虑z
?使用visit_dt
对您的记录进行排名:
ROW_NUMBER